Problema:
Vuoi dividere una stringa in Oracle.
Esempio:
Hai una frase e vorresti dividerla per il carattere spazio.
Soluzione:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
La tabella dei risultati si presenta così:
parti |
---|
An |
esempio |
frase. |
Discussione:
Per ottenere sottostringhe da una stringa, puoi utilizzare la funzione REGEXP_SUBSTR() incorporata di Oracle. Occorrono quattro argomenti:
- La stringa da cercare per una sottostringa.
- L'espressione regolare; cioè il modello che vorresti trovare.
- La posizione in cui vorresti iniziare a cercare il pattern (il valore predefinito è 1, che significa partire dall'inizio della stringa).
- Il numero che specifica quale occorrenza della sottostringa corrispondente desideri visualizzare (il valore predefinito è
1
, il che significa che dovrebbe essere mostrata la prima sottostringa corrispondente).
Nel nostro esempio, la stringa da cercare è 'An example sentence.
' Nella stringa, cerchi sottostringhe che sono parole, che qui definiamo come qualsiasi gruppo di qualsiasi carattere tranne gli spazi. Questo è il motivo per cui specifichiamo il modello '[^ ]+
', ovvero qualsiasi sequenza di caratteri non spaziali. [^ ]
sta per qualsiasi carattere tranne lo spazio e il +
segno sta per una o più occorrenze di tali caratteri. Il terzo argomento dovrebbe essere quello predefinito (1
), poiché vuoi cercare le parole nell'intera stringa dall'inizio. L'ultimo argomento è il più complicato:è necessario che il suo valore cambi per ogni stringa da cercare. Dovrebbe essere di livello:una pseudocolonna disponibile nelle query gerarchiche utilizzando CONNECT BY
– che, nel nostro caso, sarà uguale al numero di riga della riga corrente nel risultato quando si utilizza CONNECT BY. Quindi, hai:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
Questa espressione dovrebbe essere selezionata da dual
– una pseudotabella usata in Oracle quando non selezioni da una tabella reale. Quindi, dovresti CONNECT BY
l'operatore delle query gerarchiche, a condizione che la sottostringa recuperata non debba essere NULL
. La sottostringa recuperata sarà NULL una volta recuperate tutte le parole; la query gerarchica interromperà quindi l'esecuzione. Quindi, hai:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
Puoi leggere qui il livello e CONNECT BY.
Se desideri dividere la stringa con qualche altro delimitatore, puoi facilmente modificare la query. Ad esempio, se desideri dividere la stringa per la virgola, cambia '[^ ]
+' a '[^,]+
'. Ecco una query di esempio:
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;