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;