Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zamień wiele znaków w ciągu w SQL Server (T-SQL)

W SQL Server, REPLACE() funkcja umożliwia nam zastąpienie napisu innym napisem. Ale co, jeśli chcesz zastąpić listę znaków inną listą znaków?

TRANSLATE() funkcja może pomóc.

Oto wyjaśnienie firmy Microsoft dotyczące TRANSLATE() funkcja:

Zwraca ciąg znaków podany jako pierwszy argument po tym, jak niektóre znaki określone w drugim argumencie zostaną przetłumaczone na docelowy zestaw znaków określony w trzecim argumencie.

Czysta jak błoto?

Przykład

Myślę, że to jeden z tych momentów, które naprawdę wołają o przykład.

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

Wynik:

Fred (10 points)

Zasadniczo wygląda to tak, jakbyśmy dostarczyli listę wartości, aby zastąpić inną listę wartości. Ale nie ma potrzeby oddzielania każdego elementu listy separatorem.

Równa liczba znaków

Drugi i trzeci argument muszą zawierać taką samą liczbę znaków.

Innymi słowy, nie możesz tego zrobić:

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

Wynik:

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.

W tym przypadku drugi argument zawiera dwa znaki, a trzeci tylko jeden, więc otrzymujemy błąd.

Dzieje się tak, ponieważ SQL Server musi wiedzieć, który znak ma zastąpić drugi znak drugiego argumentu. Przechodzi przez każdy znak, jeden po drugim, zastępując go odpowiednim znakiem z trzeciego argumentu. Jeśli żaden nie istnieje, nie ma innego wyjścia, jak zgłosić błąd.

W porównaniu z REPLACE()

Oto przykład ilustrujący różnicę między TRANSLATE() i REPLACE() .

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

Wynik:

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

REPLACE() funkcja opuszcza [hey] dokładnie tak, jak jest, ponieważ cały ciąg nie został podany w drugim argumencie. Ta funkcja znajduje dopasowanie tylko wtedy, gdy obecny jest cały ciąg.

TRANSLATE() z drugiej strony funkcja zastępuje [hey] z (hey) ponieważ zastępuje każdy znak jeden po drugim. Nie szuka całego ciągu do zastąpienia, szuka tylko każdego pojedynczego znaku z osobna.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie jest najlepsze narzędzie do porównania dwóch baz danych SQL Server (schematu i danych)?

  2. Jak utworzyć tabelę z ograniczeniem klucza obcego w SQL Server — samouczek SQL Server / TSQL, część 66

  3. Jak wykryć i zapobiec nieoczekiwanemu wzrostowi bazy danych SQL Server TempDB

  4. Uzyskiwanie uprawnień do wykonywania xp_cmdshell

  5. Dlaczego warto korzystać z poziomu izolacji ODCZYTAJ NIEZAANGAŻOWANE?