Oracle
 sql >> Database >  >> RDS >> Oracle

Come dividere una stringa in Oracle

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;