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

Chuỗi phân tách biểu thức chính quy Oracle từ lần xuất hiện cuối cùng

Bạn có thể làm điều đó mà không cần đảo ngược kép bằng cách trích xuất các nhóm chụp khác nhau (được bao quanh trong vòng () dấu ngoặc):

WITH t ( VAL ) AS (
  SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
  SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 1 ) AS COL4,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 2 ) AS COL3,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 3 ) AS COL2,
       REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 4 ) AS COL1
FROM   t

Bạn thậm chí có thể làm cho biểu thức chính quy đơn giản hơn nhiều chỉ bằng cách sử dụng:

'^(.+)_(.+)_(.+)_(.+)$'

.+ đầu tiên là tham lam, vì vậy nó sẽ khớp càng nhiều càng tốt cho đến khi chỉ còn lại đủ chuỗi cho các trận đấu tối thiểu ở các nhóm bắt thứ 2 - thứ 4.

Tuy nhiên, bạn không cần cụm từ thông dụng :

WITH t ( VAL ) AS (
  SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
  SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT SUBSTR( val, 1,        pos1 - 1        ) AS col4,
       SUBSTR( val, pos1 + 1, pos2 - pos1 - 1 ) AS col3,
       SUBSTR( val, pos2 + 1, pos3 - pos2 - 1 ) AS col2,
       SUBSTR( val, pos3 + 1                  ) AS col1
FROM   (
  SELECT val,
         INSTR( val, '_', -1, 1 ) AS pos3,
         INSTR( val, '_', -1, 2 ) AS pos2,
         INSTR( val, '_', -1, 3 ) AS pos1
  FROM   t
);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. trích xuất ký tự đặc biệt từ một chuỗi trong oracle sql

  2. 4 cách để tìm hàng có chứa chữ thường trong Oracle

  3. Tại sao một bộ định lượng không tham lam đôi khi không hoạt động trong Oracle regex?

  4. Lỗi tạo bảng - Oracle SQL

  5. ORA-01264:Không thể tạo tên tệp logfile