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

Hàm SUBSTR () trong Oracle

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

  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 tệp login.sql cho SQLcl

  2. Cập nhật câu lệnh với tham gia bên trong trên Oracle

  3. Làm cách nào để bạn thực thi SQL từ bên trong một tập lệnh bash?

  4. Oracle:cập nhật nhiều bảng => ORA-01779:không thể sửa đổi một cột ánh xạ tới một bảng không được bảo toàn khóa

  5. Làm thế nào để kiểm tra bất kỳ số nào bị thiếu trong một dãy số?