Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

TRANSLATE in SQL SERVER

MODIFICATO:

Mi sento stupido - MatBailie ha correttamente sottolineato che la mia soluzione originale non era corretta. In realtà ho sempre pensato che TRANSLATE('abc', 'abc', 'bcd') avrebbe dovuto restituire ddd ma, dopo aver testato TRANSLATE di SQL Server 2017, vedo che "bcd" sarebbe la risposta corretta. Puoi vedere il mio originale (versione errata) guardando questa cronologia di questo post. Ecco una soluzione aggiornata che utilizza 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)');

Resi> avanti