In SQL Server, de REPLACE()
functie stelt ons in staat om een string te vervangen door een andere string. Maar wat als u een lijst met tekens wilt vervangen door een andere lijst met tekens?
De TRANSLATE()
functie kan helpen.
Hier is de uitleg van Microsoft over de TRANSLATE()
functie:
Retourneert de tekenreeks die als eerste argument is opgegeven nadat enkele tekens die in het tweede argument zijn opgegeven, zijn vertaald in een doelset van tekens die in het derde argument zijn opgegeven.
Helder als modder?
Voorbeeld
Ik denk dat dit een van die momenten is die echt om een voorbeeld schreeuwt.
SELECT TRANSLATE('Fred [10 points]', '[]', '()');
Resultaat:
Fred (10 points)
Kortom, het is alsof we een lijst met waarden hebben verstrekt om een andere lijst met waarden te vervangen. Maar het is niet nodig om elk lijstitem te scheiden met een scheidingsteken.
Gelijk aantal tekens
Het tweede en derde argument moeten een gelijk aantal tekens bevatten.
Met andere woorden, u kunt dit niet doen:
SELECT TRANSLATE('Fred [10 points]', '[]', '(');
Resultaat:
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.
In dit geval bevat het tweede argument twee karakters, maar het derde argument bevat er slechts één, dus we krijgen een foutmelding.
Dit gebeurt omdat SQL Server moet weten welk teken het tweede teken van het tweede argument moet vervangen. Het doorloopt elk teken, één voor één, en vervangt het door het corresponderende teken uit het derde argument. Als er geen bestaat, heeft het geen andere keuze dan een foutmelding te geven.
Vergeleken met REPLACE()
Hier is een voorbeeld dat het verschil illustreert tussen TRANSLATE()
en REPLACE()
.
SELECT
REPLACE('[] [hey]', '[]', '()') AS REPLACE,
TRANSLATE('[] [hey]', '[]', '()') AS TRANSLATE;
Resultaat:
+-----------+-------------+ | REPLACE | TRANSLATE | |-----------+-------------| | () [hey] | () (hey) | +-----------+-------------+
De REPLACE()
functie verlaat [hey]
precies zoals het is, omdat die hele reeks niet in het tweede argument is opgegeven. Deze functie vindt alleen een match als de hele string aanwezig is.
De TRANSLATE()
functie daarentegen vervangt [hey]
met (hey)
omdat het elk teken vervangt een voor een. Het zoekt niet naar een hele tekenreeks om te vervangen, het zoekt alleen naar elk individueel teken afzonderlijk.