sql >> Database >  >> RDS >> Oracle

Een string splitsen in Oracle

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;

  1. Alleen-lezen routering voor een Always On

  2. TOON ALLE data tussen twee data; als er geen rij bestaat voor een bepaalde datum, toon dan nul in alle kolommen

  3. Bij verwijderen cascade voor zelfverwijzende tabel

  4. Hoe u de maand van een datum haalt in MySQL