Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thay thế nhiều ký tự trong một chuỗi trong SQL Server (T-SQL)

Trong SQL Server, REPLACE() hàm cho phép chúng tôi thay thế một chuỗi bằng một chuỗi khác. Nhưng nếu bạn muốn thay thế một danh sách các ký tự bằng một danh sách các ký tự khác?

TRANSLATE() chức năng có thể hữu ích.

Đây là giải thích của Microsoft về TRANSLATE() chức năng:

Trả về chuỗi được cung cấp dưới dạng đối số đầu tiên sau khi một số ký tự được chỉ định trong đối số thứ hai được dịch thành nhóm ký tự đích được chỉ định trong đối số thứ ba.

Trong như bùn?

Ví dụ

Tôi nghĩ đây là một trong những lần thực sự hét lên để làm ví dụ.

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

Kết quả:

Fred (10 points)

Về cơ bản, có vẻ như chúng tôi đã cung cấp một danh sách các giá trị để thay thế một danh sách các giá trị khác. Nhưng không cần phải tách từng mục danh sách bằng dấu phân cách.

Số ký tự bằng nhau

Đối số thứ hai và thứ ba phải chứa một số ký tự bằng nhau.

Nói cách khác, bạn không thể làm điều này:

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

Kết quả:

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.

Trong trường hợp này, đối số thứ hai chứa hai ký tự nhưng đối số thứ ba chỉ chứa một ký tự, vì vậy chúng tôi gặp lỗi.

Điều này xảy ra bởi vì SQL Server cần biết ký tự nào sẽ thay thế ký tự thứ hai của đối số thứ hai. Nó đi qua từng ký tự, từng ký tự một, thay thế nó bằng ký tự tương ứng từ đối số thứ ba. Nếu không tồn tại, thì nó không có tùy chọn nào khác ngoài việc tạo ra một lỗi.

So với REPLACE()

Dưới đây là một ví dụ minh họa sự khác biệt giữa TRANSLATE()REPLACE() .

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

Kết quả:

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

REPLACE() chức năng rời khỏi [hey] chính xác như hiện tại, bởi vì toàn bộ chuỗi đó không được cung cấp trong đối số thứ hai. Hàm này chỉ tìm thấy một kết quả phù hợp nếu có toàn bộ chuỗi.

TRANSLATE() mặt khác thay thế hàm [hey] với (hey) vì nó thay thế từng ký tự từng cái một. Nó không tìm kiếm toàn bộ một chuỗi để thay thế, nó chỉ tìm kiếm từng ký tự riêng lẻ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng RegEx trong SQL Server

  2. Lưu byte [] vào cơ sở dữ liệu SQL Server từ C #

  3. Cách đổi tên Ràng buộc khóa chính cho nhiều bảng trong cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 64

  4. Nhận đặc quyền cột cho một bảng trong SQL Server bằng T-SQL:sp_column_privileges

  5. Kết quả được phân tách bằng dấu phẩy trong SQL