Trong Oracle, INSTR()
hàm tìm kiếm một chuỗi con trong một chuỗi nhất định và trả về một số nguyên cho biết vị trí của ký tự đầu tiên của chuỗi con này. Nếu không tìm thấy chuỗi con, hàm trả về 0
.
INSTR()
yêu cầu ít nhất hai đối số; chuỗi và chuỗi con. Nó cũng chấp nhận đối số thứ ba và thứ tư tùy chọn cho phép bạn chỉ định vị trí bắt đầu để tìm kiếm và vị trí xuất hiện để tìm kiếm.
INSTR()
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; INSTR()
, INSTRB()
, INSTRC()
, INSTR2()
và INSTR4()
. 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:
{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])
Ở đâu string
là chuỗi để tìm kiếm, substring
là chuỗi con cần tìm, position
là vị trí bắt đầu của chuỗi con và occurrence
là sự xuất hiện để tìm.
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… |
---|---|
INSTR() | Các ký tự được xác định bởi bộ ký tự đầu vào, với ký tự đầu tiên của chuỗi có vị trí 1. |
INSTRB() | Byte |
INSTRC() | Ký tự hoàn chỉnh Unicode |
INSTR2() | Điểm mã UCS2 |
INSTR4() | Điểm mã UCS4 |
Ví dụ
Đây là một ví dụ cơ bản:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Kết quả:
5
So với INSTRB()
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 INSTR()
với INSTRB()
:
SELECT
INSTR('Böyük yağlı pişik', 'yağlı') AS INSTR,
INSTRB('Böyük yağlı pişik', 'yağlı') AS INSTRB
FROM DUAL;
Kết quả:
INSTR INSTRB ________ _________ 7 9
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.
INSTR()
hàm trả về vị trí được xác định bởi bộ ký tự đầu vào, trong khi INSTRB()
hàm trả về vị trí dựa trên 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
INSTR('Big fat cat', 'fat') AS INSTR,
INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;
Kết quả:
INSTR INSTRB ________ _________ 5 5
Đó 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ự.
Vị trí bắt đầu
Dưới đây là một ví dụ chỉ định vị trí để bắt đầu tìm kiếm:
SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;
Kết quả:
11
Trong trường hợp này, tìm kiếm bắt đầu ở vị trí 8, sau hai lần xuất hiện đầu tiên. Do đó, chúng tôi có được vị trí của trận đấu thứ ba.
Chỉ định sự xuất hiện nào
Dưới đây là một ví dụ về việc chỉ định sự xuất hiện nào cần tìm:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Kết quả:
7
Trong trường hợp này, chúng tôi bắt đầu ở vị trí 1, và sau đó tìm kiếm lần xuất hiện thứ hai từ vị trí bắt đầu đó.
Đây là một lần nữa, nhưng lần này chúng tôi so sánh ba giá trị khác nhau cho occurrence
đối số:
SELECT
INSTR('That fat cat', 'at', 1, 1) AS "o1",
INSTR('That fat cat', 'at', 1, 2) AS "o2",
INSTR('That fat cat', 'at', 1, 3) AS "o3"
FROM DUAL;
Kết quả:
o1 o2 o3 _____ _____ _____ 3 7 11
Nhưng đây là điều sẽ xảy ra nếu chúng tôi tăng position
đối số:
SELECT
INSTR('That fat cat', 'at', 5, 1) AS "o1",
INSTR('That fat cat', 'at', 5, 2) AS "o2",
INSTR('That fat cat', 'at', 5, 3) AS "o3"
FROM DUAL;
Kết quả:
o1 o2 o3 _____ _____ _____ 7 11 0
Trong trường hợp này, chúng tôi không nhận được vị trí của lần xuất hiện đầu tiên, vì nó nằm trước vị trí bắt đầu của chúng tôi. Chúng tôi cũng nhận được 0
trong cột thứ ba vì không có lần xuất hiện thứ ba, dựa trên vị trí xuất phát của chúng tôi.
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 và để Oracle tìm kiếm ngược từ vị trí đó:
SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;
Kết quả:
7
Và bất kỳ lần xuất hiện nào được chỉ định đều được tính lùi so với vị trí đó:
SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;
Kết quả:
3
Đố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
INSTR(null, 'f', 1, 1) AS r1,
INSTR('Coffee', null, 1, 1) AS r2,
INSTR('Coffee', 'f', null, 1) AS r3,
INSTR('Coffee', 'f', 1, 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 INSTR()
mà không chuyển bất kỳ đối số nào dẫn đến lỗi:
SELECT INSTR()
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT INSTR() 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 INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT INSTR('Big fat cat', 'at', 1, 2, 3) FROM DUAL Error at Command Line : 1 Column : 38 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: