Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Функция TRANSLATE в SQL SERVER

РЕДАКТИРАНО:

Чувствам се тъпо - MatBailie правилно посочи, че първоначалното ми решение е неправилно. Всъщност винаги съм мислил, че TRANSLATE('abc', 'abc', 'bcd') трябваше да върне ddd, но след като тествах TRANSLATE на SQL Server 2017, виждам, че „bcd“ ще бъде правилният отговор. Можете да видите моя оригинал (неправилна версия), като разгледате тази история на тази публикация. Ето едно актуализирано решение, което използва ngrams8k :

DECLARE
  @string varchar(8000)  = 'abc',
  @fromChar varchar(100) = 'abc', -- note: no mutation
  @toChar varchar(100)   = 'bcd';

SELECT newString = 
(
  SELECT CASE WHEN x>z THEN '' WHEN x>0 THEN s ELSE t END+''
  FROM dbo.ngrams8k(@string,1) ng
  CROSS APPLY (VALUES (charindex(ng.token,@fromChar),len(@toChar),ng.token)) x(x,z,t)
  CROSS APPLY (VALUES (ng.position, substring(@toChar,x.x,1))) xx(p,s)
  ORDER BY xx.p
  FOR XML PATH(''), TYPE
).value('(text())[1]', 'varchar(8000)');

Връщане> bcd



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Справяне с проблеми с паралелността на SQL Server

  2. Вътрешни елементи на SQL Server:Проблемни оператори Pt. III – Сортове

  3. Какъв е обхватът на SET IDENTITY_INSERT xyz ON?

  4. Ограничения на SQL Server Express

  5. Как мога да избегна използването на Cursor за прилагане на този псевдо код - SQL Server