Problem:
Du vill dela en sträng i Oracle.
Exempel:
Du har en mening och du vill dela den med mellanslagstecknet.
Lösning:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
Resultattabellen ser ut så här:
delar |
---|
En |
exempel |
mening. |
Diskussion:
För att få delsträngar från en sträng kan du använda Oracles inbyggda REGEXP_SUBSTR() funktion. Det krävs fyra argument:
- Strängen som ska sökas efter en delsträng.
- Det reguljära uttrycket; dvs mönstret du vill hitta.
- Platsen där du vill börja leta efter mönstret (standardvärdet är 1, vilket betyder att börja från början av strängen).
- Numret som anger vilken förekomst av den matchande delsträngen du vill se (standardvärdet är
1
, vilket betyder att den första matchande delsträngen ska visas).
I vårt exempel är strängen som ska sökas 'An example sentence.
' I strängen letar du efter delsträngar som är ord, som vi definierar här som alla grupper av alla tecken utom mellanslag. Det är därför vi specificerar mönstret '[^ ]+
', d.v.s. vilken sekvens av tecken som inte är mellanslag. [^ ]
står för alla tecken utom mellanslag och +
tecken står för en eller flera förekomster av sådana tecken. Det tredje argumentet bör vara standard (1
), eftersom du vill leta efter ord i hela strängen från början. Det sista argumentet är det svåraste – du måste ändra dess värde för varje sträng som ska sökas. Det bör vara nivå – en pseudokolumn tillgänglig i hierarkiska frågor med CONNECT BY
– vilket i vårt fall kommer att vara lika med radnumret för den aktuella raden i resultatet när CONNECT BY används. Så du har:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
Detta uttryck bör väljas från dual
– en pseudotabell som används i Oracle när du inte väljer från en faktisk tabell. Sedan bör du CONNECT BY
den hierarkiska frågeoperatorn, under förutsättning att den hämtade delsträngen inte ska vara NULL
. Den hämtade delsträngen kommer att vara NULL när alla ord har hämtats; den hierarkiska frågan kommer då att stoppa exekveringen. Så du har:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
Här kan du läsa om nivå och CONNECT BY.
Om du vill dela strängen med någon annan avgränsare kan du enkelt ändra frågan. Om du till exempel vill dela strängen med kommatecken, ändra '[^ ]
+' till '[^,]+
'. Här är ett exempel på en fråga:
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;