Trong Oracle, TRANSLATE()
chức năng cho phép bạn thực hiện một số thay thế một ký tự, một ký tự trong một thao tác.
Nó 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.
Nó tương tự như REPLACE()
, ngoại trừ REPLACE()
hàm thay thế toàn bộ chuỗi bằng một chuỗi khác (tức là không phải từng ký tự, như TRANSLATE()
hiện).
Cú pháp
Cú pháp như sau:
TRANSLATE(expr, from_string, to_string)
Hàm trả về expr
với tất cả các lần xuất hiện của mỗi ký tự trong from_string
được thay thế bằng ký tự tương ứng của nó trong to_string
.
Ví dụ
Đây là một ví dụ cơ bản:
SELECT
TRANSLATE('Cat', 'at', 'ow')
FROM DUAL;
Kết quả:
Cow
Đây, a
và t
các ký tự đã được thay thế bằng o
và w
.
Trong trường hợp này, REPLACE()
chức năng sẽ tạo ra cùng một kết quả. Đây là hai chức năng cạnh nhau:
SELECT
TRANSLATE('Cat', 'at', 'ow') AS "TRANSLATE",
REPLACE('Cat', 'at', 'ow') AS "REPLACE"
FROM DUAL;
Kết quả:
TRANSLATE REPLACE ____________ __________ Cow Cow
Trong trường hợp này, kết quả cho cả hai chức năng là như nhau, nhưng vì những lý do khác nhau.
Đây là những gì mỗi chức năng đã làm:
-
TRANSLATE()
đã thay thếa
vàt
(từng nhân vật riêng lẻ) -
REPLACE()
đã thay thếat
(chuỗi)
Thứ tự hỗn hợp
Ví dụ này minh họa nơi TRANSLATE()
khác với REPLACE()
. Trong ví dụ này, tôi thay đổi thứ tự của các ký tự được thay thế, cũng như các ký tự để thay thế chúng:
SELECT
TRANSLATE('Cat', 'ta', 'wo') AS "TRANSLATE",
REPLACE('Cat', 'ta', 'wo') AS "REPLACE"
FROM DUAL;
Kết quả:
TRANSLATE REPLACE ____________ __________ Cow Cat
Trong trường hợp này, chỉ có TRANSLATE()
chức năng đã có hiệu lực. Điều này là do chức năng này đi qua từng ký tự một. REPLACE()
mặt khác, tìm kiếm toàn bộ chuỗi, theo đúng thứ tự.
Một ví dụ mạnh mẽ hơn
Ví dụ này minh họa một tình huống trong đó TRANSLATE()
hàm có lợi ích đáng kể so với REPLACE()
chức năng:
SELECT
TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
FROM DUAL;
Kết quả:
2*(3+4)/(7-2)
Để nhận được kết quả tương đương bằng cách sử dụng REPLACE()
, chúng tôi cần thực hiện điều này:
SELECT
REPLACE
(
REPLACE
(
REPLACE
(
REPLACE
(
'2*[3+4]/{7-2}',
'[',
'('
),
']',
')'
),
'{',
'('
),
'}',
')'
)
FROM DUAL;
Kết quả:
2*(3+4)/(7-2)
Ví dụ trên dựa trên tài liệu của Microsoft cho T-SQL TRANSLATE()
, tương tự như phiên bản Oracle.
Không phù hợp
Nếu không có kết quả phù hợp nào, TRANSLATE()
trả về chuỗi không thay đổi:
SELECT
TRANSLATE('Cat', 'x', 'y')
FROM DUAL;
Kết quả:
Cat
Phân biệt chữ hoa chữ thường
TRANSLATE()
hàm thực hiện so khớp phân biệt chữ hoa chữ thường:
SELECT
TRANSLATE('Cat', 'AT', 'ow')
FROM DUAL;
Kết quả:
Cat
Trong ví dụ này, trường hợp không khớp và do đó, chuỗi ban đầu được trả về không thay đổi.
Chuỗi trống
Dưới đây là những gì sẽ xảy ra khi một chuỗi trống được chuyển cho mỗi đối số nhất định:
SET NULL 'null';
SELECT
TRANSLATE('Cat', 'at', '') AS r1,
TRANSLATE('Cat', '', 'ow') AS r2,
TRANSLATE('', 'at', 'ow') AS r3
FROM DUAL;
Kết quả:
R1 R2 R3 _______ _______ _______ null null null
Theo mặc định, SQLcl và SQL * Plus trả về một khoảng trống bất cứ khi nào null
xảy ra do một SELECT
trong SQL tuyên bố.
Tuy nhiên, bạn có thể sử dụng SET NULL
để chỉ định một chuỗi khác được trả về. Ở đây tôi đã chỉ định rằng chuỗi null
nên được trả lại.
Ký tự không gian
Chuỗi trống không giống với ký tự khoảng trắng.
Dưới đây là những gì sẽ xảy ra khi chúng tôi thay đổi chuỗi trống thành dấu cách:
SELECT
TRANSLATE('Cat', 'at', ' ') AS r1,
TRANSLATE('Cat', ' ', 'ow') AS r2,
TRANSLATE(' ', 'at', 'ow') AS r3
FROM DUAL;
Kết quả:
R1 R2 R3 _____ ______ _____ C Cat
Dưới đây là một ví dụ minh họa cách TRANSLATE()
và REPLACE()
trả về các kết quả khác nhau khi sử dụng ký tự khoảng trắng:
SELECT
TRANSLATE(' ', ' ', 'Cow') AS TRANSLATE,
REPLACE(' ', ' ', 'Cow') AS REPLACE
FROM DUAL;
Kết quả:
TRANSLATE REPLACE ____________ __________ C Cow
Đối số rỗng
Chuyển null
đối với bất kỳ đối số nào trả về null
:
SET NULL 'null';
SELECT
TRANSLATE(null, 'dog', 'cat') AS "1",
TRANSLATE('Black dog', null, 'cat') AS "2",
TRANSLATE('Black dog', 'dog', null) AS "3"
FROM DUAL;
Kết quả:
1 2 3 _______ _______ _______ null null null
Thiếu đối số
Gọi TRANSLATE()
mà không chuyển bất kỳ đối số nào dẫn đến lỗi:
SELECT TRANSLATE()
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT TRANSLATE() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action:
Quá nhiều đối số
Và việc chuyển quá nhiều đối số sẽ trả về lỗi:
SELECT TRANSLATE('Cat', 'a', 'b', 'c')
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT TRANSLATE('Cat', 'a', 'b', 'c') FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00909: invalid number of arguments 00909. 00000 - "invalid number of arguments" *Cause: *Action: