sql >> Databasteknik >  >> RDS >> Oracle

Dela upp kommaseparerade värden till kolumner i Oracle

Akta sig! Regexp_substr-uttrycket för formatet '[^,]+' returnerar inte det förväntade värdet om det finns ett null-element i listan och du vill ha det objektet eller ett efter det. Tänk på det här exemplet där det 4:e elementet är NULL och jag vill att det 5:e elementet och därför förväntar mig att "5" ska returneras:

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

R
-
6

Överraskning! Det returnerar det 5:e NON-NULL-elementet, inte det faktiska 5:e elementet! Felaktiga uppgifter returnerades och du kanske inte ens fångar den. Prova detta istället:

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

R
-
5

Så ovan korrigerade REGEXP_SUBSTR säger att man ska leta efter den 5:e förekomsten av 0 eller fler kommaavgränsade tecken följt av ett kommatecken eller slutet av raden (tillåter nästa avgränsare, vare sig det är ett kommatecken eller slutet av raden) och när den hittas returnerar den första undergruppen (data inkluderar INTE kommatecken eller slutet av raden).

Sökmatchningsmönstret '(.*?)(,|$)' förklarade:

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

EDIT:Mer information har lagts till och förenklat regexet.

Se det här inlägget för mer information och ett förslag för att kapsla in detta i en funktion för enkel återanvändning:REGEX för att välja n:te värde från en lista, vilket tillåter nulls. Det är inlägget där jag upptäckte formatet '[^,]+' har problemet. Tyvärr är det regex-formatet du oftast kommer att se som svaret på frågor om hur man tolkar en lista. Jag ryser när jag tänker på all felaktig data som returneras av '[^,]+' !



  1. UPPER() – Konvertera till versaler i PostgreSQL

  2. Hur man åtgärdar typiska WordPress-fel

  3. Hur får jag en utdataparameter för lagrad procedur som är en array att fungera?

  4. Hur tar man bort nya radtecken från datarader i mysql?