Funkcja REGEXP_SUBSTR zwraca tylko jedną wartość. Możesz przekształcić swój ciąg znaków w pseudo-tabelę, a następnie zapytać, czy pasuje. Tam jest sposób oparty na XML w ten sposób, że ucieka mi w tej chwili, ale przy użyciu prace łączą-by, tak długo, jak masz tylko jeden ciąg źródło:
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;
... daje:
SUBSTR
--------------------
Txa233141b
Ta233141
Ta233142
Ta233147
Ta233148
... i można filtrować że z nieco prostszą wersją oryginalnego wzoru:
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
który nie jest bardzo ładny, ale nie jest posiadanie wielu wartości w jednym polu.
Dziękuję bardzo. Bardzo mi to pomogło. – florins
ten kod nie zwraca Ta233148. Aby uzyskać tę zmianę CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (str, '[^] +')), aby połączyć się z POZIOMEM <= DŁUGOŚĆ (REGEXP_REPLACE (str, '[^] +')) + 1 – sakthi
Korzystanie z tego kodu bezpośrednio z niczego oprócz prostego znaku rozdzielacza powróci do wielu wyników. Zamień LENGTH (REGEXP_REPLACE (str, '[^] +')) + 1 z REGEXP_COUNT (str, '[^] +'), a otrzymasz oczekiwany wynik. – bkqc