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()
và 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ẻ.