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;