Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

TRANSLATE-Funktion in SQL SERVER

BEARBEITET:

Ich fühle mich dumm - MatBailie hat zu Recht darauf hingewiesen, dass meine ursprüngliche Lösung falsch war. Ich dachte eigentlich immer, dass TRANSLATE('abc', 'abc', 'bcd') sollte ddd zurückgeben, aber nach dem Testen von TRANSLATE von SQL Server 2017 sehe ich, dass „bcd“ die richtige Antwort wäre. Sie können mein Original (falsche Version) sehen, indem Sie sich diesen Verlauf dieses Beitrags ansehen. Hier ist eine aktualisierte Lösung, die ngrams8k verwendet :

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)');

Rückgaben> bcd