sql >> Databasteknik >  >> RDS >> Sqlserver

Ersätt flera tecken i en sträng i SQL Server (T-SQL)

I SQL Server, REPLACE() funktion gör det möjligt för oss att ersätta en sträng med en annan sträng. Men vad händer om du vill ersätta en lista med tecken med en annan lista med tecken?

TRANSLATE() funktion kan hjälpa.

Här är Microsofts förklaring av TRANSLATE() funktion:

Returnerar strängen som tillhandahålls som ett första argument efter att några tecken som anges i det andra argumentet har översatts till en måluppsättning tecken som anges i det tredje argumentet.

Klar som lera?

Exempel

Jag tror att det här är en av de tillfällen som verkligen skriker efter ett exempel.

SELECT TRANSLATE('Fred [10 points]', '[]', '()');

Resultat:

Fred (10 points)

I grund och botten är det som om vi har tillhandahållit en värdelista för att ersätta en annan värdelista. Men det finns inget behov av att separera varje listobjekt med en avgränsare.

Lika antal tecken

Det andra och tredje argumentet måste innehålla lika många tecken.

Du kan med andra ord inte göra detta:

SELECT TRANSLATE('Fred [10 points]', '[]', '(');

Resultat:

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.

I det här fallet innehåller det andra argumentet två tecken men det tredje argumentet innehåller bara ett, så vi får ett felmeddelande.

Detta händer eftersom SQL Server behöver veta vilket tecken som ska ersätta det andra tecknet i det andra argumentet. Den går igenom varje tecken, en efter en, och ersätter den med motsvarande tecken från det tredje argumentet. Om ingen finns har den inget annat val än att skicka ett fel.

Jämfört med REPLACE()

Här är ett exempel som illustrerar skillnaden mellan TRANSLATE() och REPLACE() .

SELECT 
  REPLACE('[] [hey]', '[]', '()') AS REPLACE,
  TRANSLATE('[] [hey]', '[]', '()') AS TRANSLATE;

Resultat:

+-----------+-------------+
 | REPLACE   | TRANSLATE   |
 |-----------+-------------|
 | () [hey]  | () (hey)    |
 +-----------+-------------+ 

REPLACE() funktionen lämnar [hey] exakt som det är, eftersom hela strängen inte angavs i det andra argumentet. Denna funktion hittar bara en matchning om hela strängen är närvarande.

TRANSLATE() funktion å andra sidan ersätter [hey] med (hey) eftersom det ersätter varje tecken en och en. Den letar inte efter en hel sträng att ersätta, den letar bara efter varje enskild karaktär individuellt.


  1. Hur man formaterar ett datum i T-SQL

  2. Rails Migrations:försökte ändra kolumntypen från sträng till heltal

  3. Vad är det verkliga värdet av att ta in Microsoft Access i din organisation?

  4. Varför behöver en oracle plsql varchar2-variabel en storlek men inte en parameter?