Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Teilen Sie kommagetrennte Werte in Spalten in Oracle auf

In acht nehmen! Der Ausdruck regexp_substr im Format '[^,]+' gibt nicht den erwarteten Wert zurück, wenn die Liste ein Nullelement enthält und Sie dieses Element oder eines danach möchten. Betrachten Sie dieses Beispiel, in dem das 4. Element NULL ist und ich das 5. Element möchte und daher erwarte, dass die '5' zurückgegeben wird:

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

R
-
6

Überraschung! Es gibt das 5. NON-NULL-Element zurück, nicht das eigentliche 5. Element! Es werden falsche Daten zurückgegeben, und Sie können sie möglicherweise nicht einmal erkennen. Versuchen Sie stattdessen Folgendes:

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

R
-
5

Der oben korrigierte REGEXP_SUBSTR sagt also, dass nach dem 5. Vorkommen von 0 oder mehr durch Kommas getrennten Zeichen gesucht werden soll, gefolgt von einem Komma oder dem Ende der Zeile (ermöglicht das nächste Trennzeichen, sei es ein Komma oder das Ende der Zeile) und Wenn gefunden, geben Sie die 1. Untergruppe zurück (die Daten enthalten NICHT das Komma oder das Ende der Zeile).

Das Suchübereinstimmungsmuster '(.*?)(,|$)' erklärt:

(             = 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

BEARBEITEN:Weitere Informationen hinzugefügt und die Regex vereinfacht.

In diesem Beitrag finden Sie weitere Informationen und einen Vorschlag, dies in einer Funktion zur einfachen Wiederverwendung zu kapseln:REGEX, um den n-ten Wert aus einer Liste auszuwählen, wobei Nullen zulässig sind. Dies ist der Beitrag, in dem ich das Format '[^,]+' hat das Problem. Leider ist es das Regex-Format, das Sie am häufigsten als Antwort auf Fragen zum Analysieren einer Liste sehen werden. Ich schaudere, wenn ich an all die falschen Daten denke, die von '[^,]+' zurückgegeben werden !