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

CHR (0) trong REGEXP_LIKE

CHR(0) là ký tự được sử dụng để kết thúc một chuỗi trong ngôn ngữ lập trình C (trong số các ký tự khác).

Khi bạn vượt qua CHR(0) đến hàm, nó sẽ chuyển nó đến hàm cấp thấp hơn sẽ phân tích cú pháp các chuỗi bạn đã chuyển vào và xây dựng một mẫu biểu thức chính quy từ chuỗi đó. Mẫu biểu thức chính quy này sẽ thấy CHR(0) và nghĩ rằng đó là dấu kết thúc chuỗi và bỏ qua phần còn lại của mẫu.

Hành vi dễ thấy hơn với REGEXP_REPLACE :

SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM   DUAL;

Điều gì xảy ra khi bạn chạy điều này:

  • CHR(0) được biên dịch thành một biểu thức chính quy và trở thành một kết thúc chuỗi.
  • Giờ đây, mẫu chỉ là phần cuối của chuỗi và vì vậy mẫu là một chuỗi có độ dài bằng không.
  • Sau đó, biểu thức chính quy được so khớp với chuỗi đầu vào và nó đọc ký tự đầu tiên a và tìm thấy một chuỗi có độ dài bằng 0 có thể được khớp trước a vì vậy nó thay thế không có gì nó đã khớp trước a với một d đưa ra đầu ra da .
  • Sau đó, nó sẽ lặp lại cho việc chuyển đổi ký tự tiếp theo b thành db .
  • và tiếp tục như vậy cho đến khi bạn đến cuối chuỗi khi nó khớp với mẫu độ dài bằng 0 và thêm một d cuối cùng .

Và bạn sẽ nhận được đầu ra:

dadbdcd_ded

( trong đó _ là CHR(0) nhân vật. )

Lưu ý:CHR(0) trong đầu vào không được thay thế.

Nếu chương trình khách bạn đang sử dụng cũng đang cắt ngắn chuỗi tại CHR(0) bạn có thể không thấy toàn bộ kết quả đầu ra (đây là vấn đề với cách ứng dụng khách của bạn đại diện cho chuỗi chứ không phải với đầu ra của Oracle) nhưng nó cũng có thể được hiển thị bằng cách sử dụng DUMP() :

SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;

Kết quả đầu ra:

Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100

[TL; DR] Vậy điều gì đang xảy ra với

REGEXP_LIKE( '1234567890', CHR(0) )

Nó sẽ tạo một mẫu biểu thức chính quy chuỗi có độ dài bằng 0 và nó sẽ tìm kiếm kết quả khớp có độ dài bằng 0 trước 1 ký tự - mà nó sẽ tìm thấy và sau đó trả về rằng nó đã tìm thấy một kết quả phù hợp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để xuất kết quả của câu lệnh SELECT được thực thi bằng SQL động nguyên gốc?

  2. Xây dựng biểu đồ phụ thuộc bảng với truy vấn đệ quy

  3. Không đủ đặc quyền khi tạo bảng trong Oracle SQL Developer

  4. PLSQL:Nhận số lượng bản ghi được cập nhật so với được chèn khi sử dụng câu lệnh hợp nhất

  5. Xóa các tệp khỏi một thư mục trong quy trình được lưu trữ oracle