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

Hàm INSTR () trong Oracle

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()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:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khi nào tôi cần sử dụng dấu chấm phẩy và dấu gạch chéo trong Oracle SQL?

  2. 11gR2 Compression Advisor =Ác ma

  3. Các hàm số trong Oracle (Danh sách đầy đủ)

  4. Tạo lại nút RAC không hợp lệ

  5. số hàng không hiển thị bất kỳ hàng nào khi sử dụng giữa từ khóa