Bắt đầu với SQL Server 2017, bây giờ bạn có thể sử dụng T-SQL TRANSLATE()
chức năng dịch một hoặc nhiều ký tự thành một bộ ký tự khác.
Thoạt nhìn, bạn có thể nghĩ rằng TRANSLATE()
hàm hoạt động giống hệt như REPLACE()
chức năng, nhưng có sự khác biệt đáng kể giữa hai.
Định nghĩa
Trước tiên, hãy xem định nghĩa của từng chức năng:
-
REPLACE()
- Thay thế tất cả các lần xuất hiện của một giá trị chuỗi được chỉ định bằng một giá trị chuỗi khác.
-
TRANSLATE()
- 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 tập ký tự đích.
Sự khác biệt chính là cách mỗi hàm xử lý với nhiều ký tự. REPLACE()
thay thế một chuỗi bằng một chuỗi khác. Do đó, nếu một chuỗi chứa nhiều ký tự thì mỗi ký tự phải theo cùng một thứ tự. TRANSLATE()
mặt khác, thay thế từng ký tự một, bất kể thứ tự của các ký tự đó.
Ví dụ - Kết quả tương tự
Có một số trường hợp cả hai hàm sẽ trả về cùng một kết quả. Như thế này:
SELECT REPLACE('123', '123', '456') AS Replace, TRANSLATE('123', '123', '456') AS Translate;
Kết quả:
Replace Translate ------- --------- 456 456
Trong trường hợp này, REPLACE()
trả về 456
bởi vì chuỗi chính xác trong đối số thứ hai khớp với một chuỗi trong đối số đầu tiên (trong trường hợp này, nó là toàn bộ chuỗi).
TRANSLATE()
trả về 456
bởi vì mỗi ký tự trong đối số thứ hai có trong đối số đầu tiên.
Ví dụ - Kết quả khác nhau
Bây giờ là một ví dụ minh họa một trong những điểm khác biệt giữa TRANSLATE()
và REPLACE()
:
SELECT REPLACE('123', '321', '456') AS Replace, TRANSLATE('123', '321', '456') AS Translate;
Kết quả:
Replace Translate ------- --------- 123 654
Trong trường hợp này, REPLACE()
không có tác dụng (nó trả về chuỗi ban đầu) vì đối số thứ hai không phải là đối sánh chính xác với đối số đầu tiên (hoặc một chuỗi con bên trong nó). Mặc dù đối số thứ hai chứa các ký tự chính xác, chúng không theo cùng thứ tự với đối số đầu tiên và do đó, toàn bộ chuỗi không khớp.
TRANSLATE()
không có ảnh hưởng bởi vì mỗi ký tự trong đối số thứ hai có mặt trong đối số đầu tiên. Không quan trọng là chúng theo một thứ tự khác nhau, bởi vì mỗi ký tự được dịch một. SQL Server dịch ký tự đầu tiên, sau đó là ký tự thứ hai, sau đó là ký tự thứ ba, v.v.
Chuỗi không liền kề
Tương tự như ví dụ trước, bạn cũng có thể nhận được các kết quả khác nhau khi đối số đầu tiên chứa các ký tự trong đối số thứ hai, nhưng chúng không liền nhau:
SELECT REPLACE('1car23', '123', '456') AS Replace, TRANSLATE('1car23', '123', '456') AS Translate;
Kết quả:
Replace Translate ------- --------- 1car23 4car56
Đối số có độ dài khác
Bạn cũng có thể nhận được các kết quả khác nhau giữa mỗi hàm bất cứ khi nào có sự khác biệt về số lượng ký tự trong các đối số khác nhau.
Dưới đây là một ví dụ trong đó đối số đầu tiên chứa ít ký tự hơn đối số thứ hai và thứ ba:
SELECT REPLACE('123', '1234', '4567') AS Replace, TRANSLATE('123', '1234', '4567') AS Translate;
Kết quả:
Replace Translate ------- --------- 123 456
Trong trường hợp này, REPLACE()
không có tác dụng vì đối số thứ hai chứa nhiều ký tự hơn đối số đầu tiên. Do đó, đối số đầu tiên không thể chứa đối số thứ hai.
TRANSLATE()
chức năng tuy nhiên, không có ảnh hưởng trong trường hợp này. Điều này là do đối số thứ hai chứa các ký tự nằm trong đối số đầu tiên. Không thành vấn đề khi đối số thứ hai chứa nhiều ký tự hơn đối số đầu tiên. Điều quan trọng nhất là đối số thứ ba chứa cùng số ký tự với đối số thứ hai.
Cũng có trường hợp REPLACE()
hoạt động hoàn hảo nhưng TRANSLATE()
ném ra một lỗi.
Ví dụ:
SELECT REPLACE('1234', '123', '4567') AS Replace;
Kết quả:
Replace ------- 45674
Trong trường hợp này, REPLACE()
hoạt động như mong đợi.
Tuy nhiên, nếu chúng tôi cung cấp các đối số giống nhau cho TRANSLATE()
, chúng tôi gặp lỗi:
SELECT TRANSLATE('1234', '123', '4567') AS Translate;
Kết quả:
LỗiError: The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
Như thông báo lỗi nêu rõ, đối số thứ hai và thứ ba phải chứa một số lượng ký tự bằng nhau.
Khi nào tôi nên sử dụng REPLACE ()?
Bạn nên sử dụng REPLACE()
khi bạn cần thay thế tất cả các lần xuất hiện của một chuỗi cụ thể, chính xác như nó được viết. Ví dụ:thay đổi tên của ai đó thành một tên khác.
Sử dụng TRANSLATE()
trong những trường hợp như vậy có thể dẫn đến kết quả thảm hại:
SELECT REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace, TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;
Kết quả:
Replace Translate ------------- ------------- Jason Simpson Jason Sispsan
Khi nào tôi nên sử dụng TRANSLATE ()?
Như đã trình bày trong ví dụ trước, TRANSLATE()
hàm có thể hữu ích nếu bạn cần thay thế tất cả các lần xuất hiện của từng ký tự được chỉ định, bất kể thứ tự của chúng trong chuỗi ban đầu.
Nó cũng có thể được sử dụng thay cho REPLACE()
chỉ đơn giản là mã. Dưới đây là một ví dụ (dựa trên một ví dụ trên trang web của Microsoft):
SELECT REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')') AS Replace, TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()') AS Translate;
Kết quả:
Replace Translate ------------- ------------- 2*(3+4)/(7-2) 2*(3+4)/(7-2)