sql >> Databasteknik >  >> RDS >> Sqlserver

TRANSLATE-funktionen i SQL SERVER

REDIGERAD:

Jag känner mig dum - MatBailie påpekade korrekt att min ursprungliga lösning var felaktig. Jag har faktiskt alltid trott att TRANSLATE('abc', 'abc', 'bcd') var tänkt att returnera ddd men efter att ha testat SQL Server 2017:s TRANSLATE ser jag att 'bcd' skulle vara det korrekta svaret. Du kan se min original (felaktig version) genom att titta på den här historiken för detta inlägg. Här är en uppdaterad lösning som använder 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)');

Returer> bcd



  1. MySQL välj gå med var OCH var

  2. Upsert med attribut inkluderat updated_at

  3. Få kolumnnamn som har maxvärdet i en rad sql

  4. Hämtar taggar baserat på post-ID