V SQL Server, REPLACE()
Funkce nám umožňuje nahradit řetězec jiným řetězcem. Ale co když chcete nahradit seznam znaků jiným seznamem znaků?
TRANSLATE()
funkce může pomoci.
Zde je vysvětlení společnosti Microsoft pro TRANSLATE()
funkce:
Vrátí řetězec zadaný jako první argument poté, co jsou některé znaky zadané ve druhém argumentu přeloženy do cílové sady znaků zadaných ve třetím argumentu.
Jasné jako bláto?
Příklad
Myslím, že tohle je jeden z těch okamžiků, které opravdu volají po příkladu.
SELECT TRANSLATE('Fred [10 points]', '[]', '()');
Výsledek:
Fred (10 points)
V podstatě je to, jako bychom poskytli seznam hodnot, který nahradí jiný seznam hodnot. Není však nutné oddělovat každou položku seznamu oddělovačem.
Stejný počet znaků
Druhý a třetí argument musí obsahovat stejný počet znaků.
Jinými slovy, nemůžete to udělat:
SELECT TRANSLATE('Fred [10 points]', '[]', '(');
Výsledek:
Msg 9828, Level 16, State 1, Line 1 The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
V tomto případě druhý argument obsahuje dva znaky, ale třetí argument obsahuje pouze jeden, takže dostaneme chybu.
K tomu dochází, protože SQL Server potřebuje vědět, který znak má nahradit druhý znak druhého argumentu. Prochází každý znak, jeden po druhém, a nahrazuje jej odpovídajícím znakem ze třetího argumentu. Pokud žádná neexistuje, pak nemá jinou možnost než vyvolat chybu.
Ve srovnání s REPLACE()
Zde je příklad, který ilustruje rozdíl mezi TRANSLATE()
a REPLACE()
.
SELECT
REPLACE('[] [hey]', '[]', '()') AS REPLACE,
TRANSLATE('[] [hey]', '[]', '()') AS TRANSLATE;
Výsledek:
+-----------+-------------+ | REPLACE | TRANSLATE | |-----------+-------------| | () [hey] | () (hey) | +-----------+-------------+
REPLACE()
funkce opustí [hey]
přesně tak, jak to je, protože celý tento řetězec nebyl poskytnut ve druhém argumentu. Tato funkce najde shodu pouze v případě, že je přítomen celý řetězec.
TRANSLATE()
funkce na druhé straně nahrazuje [hey]
pomocí (hey)
protože nahrazuje každý znak jeden za druhým. Nehledá celý řetězec k nahrazení, hledá pouze každý jednotlivý znak zvlášť.