Probleem:
U wilt een string splitsen in Oracle.
Voorbeeld:
Je hebt een zin en je wilt deze splitsen door de spatie.
Oplossing:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
De resultatentabel ziet er als volgt uit:
onderdelen |
---|
Een |
voorbeeld |
zin. |
Discussie:
Om substrings uit een string te halen, kunt u de ingebouwde REGEXP_SUBSTR()-functie van Oracle gebruiken. Er zijn vier argumenten nodig:
- De tekenreeks waarnaar moet worden gezocht voor een subtekenreeks.
- De reguliere expressie; d.w.z. het patroon dat u wilt vinden.
- De positie waarop u naar het patroon wilt zoeken (de standaardwaarde is 1, wat betekent dat u vanaf het begin van de tekenreeks begint).
- Het nummer dat aangeeft welk exemplaar van de overeenkomende subtekenreeks u wilt zien (de standaardwaarde is
1
, wat betekent dat de eerste overeenkomende subtekenreeks moet worden weergegeven).
In ons voorbeeld is de tekenreeks die moet worden doorzocht 'An example sentence.
' In de tekenreeks zoekt u naar subtekenreeksen die woorden zijn, die we hier definiëren als groepen van willekeurige tekens, behalve spaties. Daarom specificeren we het patroon '[^ ]+
', d.w.z. elke reeks niet-spatietekens. [^ ]
staat voor elk teken behalve spatie, en de +
teken staat voor een of meer exemplaren van dergelijke tekens. Het derde argument zou de standaard moeten zijn (1
), omdat u vanaf het begin naar woorden in de hele tekenreeks wilt zoeken. Het laatste argument is het lastigste - je moet de waarde ervan wijzigen voor elke string die moet worden doorzocht. Het moet niveau zijn - een pseudokolom die beschikbaar is in hiërarchische zoekopdrachten met behulp van CONNECT BY
– wat in ons geval gelijk zal zijn aan het rijnummer van de huidige rij in het resultaat wanneer VERBINDEN DOOR wordt gebruikt. Dus je hebt:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
Deze uitdrukking moet worden geselecteerd uit dual
- een pseudotabel die in Oracle wordt gebruikt wanneer u niet uit een echte tabel selecteert. Dan moet je CONNECT BY
de hiërarchische query-operator, op voorwaarde dat de opgehaalde subtekenreeks niet NULL
mag zijn . De opgehaalde subtekenreeks is NULL zodra alle woorden zijn opgehaald; de hiërarchische query stopt dan de uitvoering. Dus je hebt:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
U kunt hier lezen over niveau en VERBINDEN DOOR.
Als u de tekenreeks wilt splitsen door een ander scheidingsteken, kunt u de query eenvoudig wijzigen. Als u de tekenreeks bijvoorbeeld door de komma wilt splitsen, wijzigt u '[^ ]
+' tot '[^,]+
'. Hier is een voorbeeldvraag:
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;