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

Chia các giá trị được phân tách bằng dấu phẩy thành các cột trong Oracle

Hãy coi chừng! Biểu thức regexp_substr của định dạng '[^,] +' sẽ không trả về giá trị mong đợi nếu có một phần tử rỗng trong danh sách và bạn muốn mục đó hoặc một phần tử sau nó. Hãy xem xét ví dụ này, trong đó phần tử thứ 4 là NULL và tôi muốn phần tử thứ 5 và do đó mong muốn trả về '5':

SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;

R
-
6

Bất ngờ! Nó trả về phần tử NON-NULL thứ 5, không phải phần tử thứ 5 thực tế! Dữ liệu không chính xác được trả về và bạn thậm chí có thể không nắm bắt được. Hãy thử cái này thay thế:

SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;

R
-
5

Vì vậy, REGEXP_SUBSTR đã sửa ở trên nói rằng hãy tìm lần xuất hiện thứ 5 của 0 hoặc nhiều ký tự được phân tách bằng dấu phẩy theo sau bởi dấu phẩy hoặc cuối dòng (cho phép dấu phân tách tiếp theo, có thể là dấu phẩy hoặc cuối dòng) và khi được tìm thấy, hãy trả về nhóm con thứ nhất (dữ liệu KHÔNG bao gồm dấu phẩy hoặc cuối dòng).

Mẫu đối sánh tìm kiếm '(. *?) (, | $)' giải thích:

(             = Start a group
.             = match any character
*             = 0 or more matches of the preceding character
?             = Match 0 or 1 occurrences of the preceding pattern
)             = End the 1st group
(             = Start a new group (also used for logical OR)
,             = comma
|             = OR
$             = End of the line
)             = End the 2nd group

CHỈNH SỬA:Thêm thông tin và đơn giản hóa regex.

Xem bài đăng này để biết thêm thông tin và đề xuất đóng gói điều này trong một hàm để dễ dàng sử dụng lại:REGEX để chọn giá trị thứ n từ danh sách, cho phép nulls Đây là bài đăng mà tôi phát hiện ra định dạng '[^,] +' có vấn đề. Thật không may, đó là định dạng regex mà bạn thường thấy nhất là câu trả lời cho các câu hỏi liên quan đến cách phân tích cú pháp danh sách. Tôi rùng mình khi nghĩ đến việc trả về tất cả dữ liệu không chính xác bởi '[^,] +' !



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị tên của tất cả các ràng buộc cho một bảng trong Oracle SQL

  2. EM12c hiện cho phép DB12c làm đại diện

  3. Sao chép dữ liệu từ tệp vào CLOB trong Oracle

  4. Hàm FLOOR () trong Oracle

  5. REGEX để chọn giá trị thứ n từ danh sách, cho phép các giá trị rỗng