Problém:
Chcete rozdělit řetězec v Oracle.
Příklad:
Máte větu a chtěli byste ji rozdělit mezerou.
Řešení:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
Výsledná tabulka vypadá takto:
části |
---|
An |
příklad |
věta. |
Diskuse:
Chcete-li získat podřetězce z řetězce, můžete použít vestavěnou funkci REGEXP_SUBSTR() společnosti Oracle. Vyžaduje čtyři argumenty:
- Řetězec, ve kterém se má hledat podřetězec.
- regulární výraz; tj. vzor, který chcete najít.
- Pozice, na které chcete začít hledat vzor (výchozí hodnota je 1, což znamená začít od začátku řetězce).
- Číslo určující, který výskyt odpovídajícího podřetězce chcete zobrazit (výchozí hodnota je
1
, což znamená, že by se měl zobrazit první odpovídající podřetězec).
V našem příkladu je řetězec, který má být prohledán, 'An example sentence.
' V řetězci hledáte podřetězce, což jsou slova, která zde definujeme jako jakékoli skupiny libovolných znaků kromě mezer. Proto zadáváme vzor '[^ ]+
', tj. jakákoli posloupnost znaků bez mezer. [^ ]
zastupuje jakýkoli znak kromě mezery a +
znak znamená jeden nebo více výskytů takových znaků. Třetí argument by měl být výchozí (1
), protože chcete hledat slova v celém řetězci od začátku. Poslední argument je nejzáludnější – potřebujete, aby se jeho hodnota změnila pro každý prohledávaný řetězec. Mělo by to být úroveň – pseudosloupec dostupný v hierarchických dotazech pomocí CONNECT BY
– což se v našem případě bude rovnat číslu řádku aktuálního řádku ve výsledku při použití CONNECT BY. Takže máte:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
Tento výraz by měl být vybrán z dual
– pseudotabulka používaná v Oracle, když nevybíráte ze skutečné tabulky. Poté byste měli CONNECT BY
hierarchický operátor dotazů pod podmínkou, že načtený podřetězec by neměl být NULL
. Jakmile budou načtena všechna slova, získaný podřetězec bude mít hodnotu NULL; hierarchický dotaz pak zastaví provádění. Takže máte:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
Zde si můžete přečíst o úrovni a CONNECT BY.
Pokud byste chtěli řetězec rozdělit nějakým jiným oddělovačem, můžete dotaz snadno upravit. Pokud například chcete rozdělit řetězec čárkou, změňte '[^ ]
+' až '[^,]+
'. Zde je příklad dotazu:
SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;