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

Jak rozdělit řetězec v Oracle

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;

  1. MS-Access Recordset a Class Module

  2. Zpětné inženýrství datového modelu pomocí Oracle SQL Developer

  3. Automatický sběr dat o dokončených úkolech v MS SQL Server

  4. Jak mohu inicializovat databázi MySQL se schématem v kontejneru Docker?