Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Замяна на множество символи в низ в SQL Server (T-SQL)

В SQL Server, REPLACE() функцията ни позволява да заменим низ с друг низ. Но какво ще стане, ако искате да замените списък със знаци с друг списък със знаци?

TRANSLATE() функция може да помогне.

Ето обяснението на Microsoft за TRANSLATE() функция:

Връща низа, предоставен като първи аргумент, след като някои знаци, посочени във втория аргумент, са преведени в целеви набор от знаци, посочени в третия аргумент.

Чисто като кал?

Пример

Мисля, че това е един от онези моменти, които наистина крещят за пример.

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

Резултат:

Fred (10 points)

По принцип, сякаш сме предоставили списък със стойности, за да заменим друг списък със стойности. Но няма нужда да разделяте всеки елемент от списъка с разделител.

Равен брой знаци

Вторият и третият аргумент трябва да съдържат равен брой знаци.

С други думи, не можете да направите това:

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

Резултат:

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.

В този случай вторият аргумент съдържа два знака, но третият аргумент съдържа само един, така че получаваме грешка.

Това се случва, защото SQL Server трябва да знае кой знак трябва да замени втория знак от втория аргумент. Той преминава през всеки знак, един по един, като го заменя със съответния знак от третия аргумент. Ако такава не съществува, няма друга опция, освен да изведе грешка.

В сравнение с REPLACE()

Ето пример, който илюстрира разликата между TRANSLATE() и REPLACE() .

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

Резултат:

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

REPLACE() функцията напуска [hey] точно такъв, какъвто е, защото целият низ не беше предоставен във втория аргумент. Тази функция намира съвпадение само ако присъства целият низ.

TRANSLATE() функцията от друга страна замества [hey] с (hey) защото замества всеки знак един по един. Той не търси цял низ за замяна, а само всеки отделен знак поотделно.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите всички свързани подграфи на неориентиран граф

  2. Мога ли да задам ignore_dup_key за първичен ключ?

  3. Създайте задание за агент на SQL Server в Azure Data Studio

  4. Функцията за дял COUNT() OVER е възможна с помощта на DISTINCT

  5. Въведение в SQL Server