REGEXP_SUBSTR chỉ trả về một giá trị. Bạn có thể biến chuỗi của bạn thành một bảng giả và sau đó truy vấn cho phù hợp. Có một cách dựa trên XML để làm điều này mà thoát cho tôi vào lúc này, nhưng sử dụng công trình kết nối theo, miễn là bạn chỉ có một chuỗi nguồn:
SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
FROM (
SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1;
... mang đến cho bạn:
SUBSTR
--------------------
Txa233141b
Ta233141
Ta233142
Ta233147
Ta233148
... và bạn có thể lọc rằng với một phiên bản hơi đơn giản của mô hình ban đầu của bạn:
SELECT substr
FROM (
SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
FROM (
SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str
FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1
)
WHERE REGEXP_LIKE(substr, '^[A-Za-z]{2}[0-9]{5,}$');
SUBSTR
--------------------
Ta233141
Ta233142
Ta233147
Ta233148
đó là không phải là rất đẹp, nhưng không phải đang nắm giữ nhiều giá trị trong một lĩnh vực.
Nguồn
2013-07-11 15:08:31
Cảm ơn bạn rất nhiều. Nó đã giúp tôi rất nhiều. – florins
mã này không trả về Ta233148. Để nhận thay đổi đó CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (str, '[^] +')) để CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (str, '[^] +')) + 1 – sakthi
Sử dụng mã này trực tiếp với bất cứ điều gì, nhưng một nhân vật splitter đơn giản sẽ trở lại cách để nhiều kết quả. Thay thế LENGTH (REGEXP_REPLACE (str, '[^] +')) + 1 bằng REGEXP_COUNT (str, '[^] +') và bạn sẽ nhận được kết quả mong đợi. – bkqc