sql >> Databasteknik >  >> RDS >> Oracle

Hur man delar en sträng i Oracle

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;

  1. Hur man definierar en anpassad ORDER BY order i mySQL

  2. Hur man skapar ordningsnummer i PostgreSQL

  3. Det korrekta sättet att implementera en unik begränsning som tillåter flera NULL-värden i SQL Server

  4. Konsten att isolera beroenden och data i databasenhetstestning