sql >> Databáze >  >> RDS >> Oracle

Rozdělte hodnoty oddělené čárkami do sloupců v Oracle

Pozor! Výraz regexp_substr ve formátu '[^,]+' nevrátí očekávanou hodnotu, pokud je v seznamu prvek null a chcete tuto položku nebo jednu za ní. Zvažte tento příklad, kde je 4. prvek NULL a já chci 5. prvek, a proto očekávám, že se vrátí '5':

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

R
-
6

Překvapení! Vrací 5. NON-NULL prvek, nikoli skutečný 5. prvek! Vrátila se nesprávná data a možná je ani nezachytíte. Zkuste toto:

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

R
-
5

Výše opravený REGEXP_SUBSTR tedy říká, že se má hledat 5. výskyt 0 nebo více znaků oddělených čárkou následovaný čárkou nebo koncem řádku (umožňuje další oddělovač, ať už je to čárka nebo konec řádku) a při nalezení vrátí 1. podskupinu (data NEOBSAHUJÍ čárku ani konec řádku).

Vzor vyhledávání '(.*?)(,|$)' vysvětlil:

(             = 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:Přidáno více informací a zjednodušeno regulární výraz.

Další informace a návrh zapouzdřit to do funkce pro snadné opětovné použití naleznete v tomto příspěvku:REGEX pro výběr n-té hodnoty ze seznamu, což umožňuje nulls Je to příspěvek, kde jsem objevil formát '[^,]+' má problém. Bohužel je to formát regulárního výrazu, který nejčastěji uvidíte jako odpověď na otázky, jak analyzovat seznam. Otřásám se při pomyšlení na všechna nesprávná data, která vrací '[^,]+' !



  1. Jak vytvořit zástupce pro SSMS a automaticky se připojit k výchozímu serveru SQL - SQ:Server / TSQL výukový program, část 4

  2. Indexy SQL Server – vzestupné nebo sestupné, jaký je v tom rozdíl?

  3. Jak přetypuji char na celé číslo při dotazování v django ORM?

  4. Hodnoty vazby PDO pro příkaz MySQL IN