Trong Oracle, SUBSTR()
hàm trả về một chuỗi con từ một chuỗi đã cho.
SUBSTR()
yêu cầu ít nhất hai đối số; chuỗi và vị trí để trích xuất chuỗi con từ đó. Nó cũng chấp nhận đối số thứ ba tùy chọn cho phép bạn chỉ định thời lượng của chuỗi con.
SUBSTR()
cũng có thể được coi như một nhóm các chức năng. Có năm chức năng riêng biệt; SUBSTR()
, SUBSTRB()
, SUBSTRC()
, SUBSTR2()
và SUBSTR4()
. Mỗi hàm tính toán độ dài theo một cách khác nhau.
Cú pháp
Cú pháp như sau:
{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])
Ở đâu char
là chuỗi, position
là vị trí bắt đầu của chuỗi con và substring_length
là độ dài của các ký tự để trích xuất.
Các hàm tính toán độ dài như sau:
Hàm | Tính độ dài bằng cách sử dụng… |
---|---|
SUBSTR() | Các ký tự được xác định bởi bộ ký tự đầu vào |
SUBSTRB() | Byte |
SUBSTRC() | Ký tự hoàn chỉnh Unicode |
SUBSTR2() | Điểm mã UCS2 |
SUBSTR4() | Điểm mã UCS4 |
Ví dụ
Đây là một ví dụ cơ bản:
SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;
Kết quả:
fat cat
So với SUBSTRB()
Ví dụ này cho thấy các kết quả có thể khác nhau như thế nào, tùy thuộc vào chức năng cụ thể bạn đang sử dụng và bộ ký tự có liên quan.
Trong trường hợp này, chúng tôi so sánh SUBSTR()
với SUBSTRB()
:
SELECT
SUBSTR('Böyük yağlı pişik', 5) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5) AS SUBSTRB
FROM DUAL;
Kết quả:
SUBSTR SUBSTRB ________________ _________________ k yağlı pişik ük yağlı pişik
Chúng ta có thể thấy rằng hai hàm trả về hai kết quả khác nhau. Điều này là do một số ký tự trong chuỗi này sử dụng hai byte.
SUBSTR()
hàm trả về độ dài trong các ký tự c như được xác định bởi bộ ký tự đầu vào, trong khi SUBSTRB()
hàm trả về độ dài tính bằng byte .
Nếu chúng ta quay lại chuỗi ban đầu, kết quả giống nhau giữa hai hàm:
SELECT
SUBSTR('Big fat cat', 5) AS SUBSTR,
SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;
Kết quả:
SUBSTR SUBSTRB __________ __________ fat cat fat cat
Đó là bởi vì chuỗi này chỉ sử dụng một byte cho mỗi ký tự và do đó độ dài tính bằng byte giống với số ký tự.
Độ dài chuỗi con
Dưới đây là một ví dụ chỉ định độ dài của chuỗi con cần trích xuất:
SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;
Kết quả:
fat
Và đây là so sánh giữa SUBSTR()
và SUBSTRB()
khi chỉ định độ dài trên các ký tự nhiều byte:
SELECT
SUBSTR('Böyük yağlı pişik', 5, 9) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5, 9) AS SUBSTRB
FROM DUAL;
Kết quả:
SUBSTR SUBSTRB ____________ __________ k yağlı p ük yağl
Vị trí 0
Một điều kỳ lạ của hàm này là chuyển vị trí của 0
tạo ra kết quả giống như chuyển 1
:
SELECT
SUBSTR('Big fat cat', 0, 3) AS "0",
SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;
Kết quả:
0 1 ______ ______ Big Big
Vị trí phủ định
Việc chỉ định giá trị âm cho vị trí khiến vị trí bắt đầu được đếm ngược so với cuối chuỗi:
SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;
Kết quả:
cat
Và bất kỳ độ dài nào được chỉ định đều được tính từ vị trí đó trở đi:
SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;
Kết quả:
fat
Đối số rỗng
Nếu bất kỳ (hoặc tất cả) đối số null
, kết quả là null
:
SET NULL 'null';
SELECT
SUBSTR(null, 3, 3) AS r1,
SUBSTR('Coffee', null, 3) AS r2,
SUBSTR('Coffee', 3, null) AS r3,
SUBSTR(null, null, null) AS r4
FROM DUAL;
Kết quả:
R1 R2 R3 R4 _______ _______ _______ _______ null 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.
Số lượng đối số không chính xác
Gọi SUBSTR()
mà không chuyển bất kỳ đối số nào dẫn đến lỗi:
SELECT SUBSTR()
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT SUBSTR() 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:
Và việc chuyển quá nhiều đối số cũng dẫn đến lỗi:
SELECT SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT SUBSTR('Big fat cat', 3, 2, 1) FROM DUAL Error at Command Line : 1 Column : 36 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: