sql >> Database >  >> RDS >> Sqlserver

TRANSLATE-functie in SQL SERVER

BEWERKT:

Ik voel me dom - MatBailie wees er terecht op dat mijn oorspronkelijke oplossing onjuist was. Ik dacht eigenlijk altijd dat TRANSLATE('abc', 'abc', 'bcd') moest ddd retourneren, maar na het testen van SQL Server 2017's TRANSLATE zie ik dat 'bcd' het juiste antwoord zou zijn. Je kunt mijn origineel (onjuiste versie) zien door naar deze geschiedenis van dit bericht te kijken. Hier is een bijgewerkte oplossing die gebruikmaakt van 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)');

Retourneren> bcd



  1. Verschillen tussen SET var ='abc' en SET GLOBAL var ='abc'?

  2. De naam van een tabel in SQL Server wijzigen (T-SQL)

  3. Beslis tussen controle op basis van agenten of controle zonder agenten

  4. Kan dit in een MySQL-query of moet dit in PHP? (serverzijde)