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

SQL Server REPLACE () so với TRANSLATE ():Sự khác biệt là gì?

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()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ỗi
Error: 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo Ràng buộc khóa ngoại bằng BẬT XÓA CASCADE trong SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 80

  2. Chia một giá trị cột thành nhiều giá trị cột

  3. Tôi có thực sự cần sử dụng SET XACT_ABORT ON không?

  4. Ví dụ về Chuyển đổi ‘smalldatetime’ thành ‘datetime’ trong SQL Server (T-SQL)

  5. lỗi 'datetime2' khi sử dụng khung thực thể trong VS 2010 .net 4.0