Problema:
Você deseja dividir uma string no Oracle.
Exemplo:
Você tem uma frase e gostaria de dividi-la pelo caractere de espaço.
Solução:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
A tabela de resultados fica assim:
partes |
---|
Um |
exemplo |
frase. |
Discussão:
Para obter substrings de uma string, você pode usar a função REGEXP_SUBSTR() integrada do Oracle. São necessários quatro argumentos:
- A string a ser pesquisada por uma substring.
- A expressão regular; ou seja, o padrão que você gostaria de encontrar.
- A posição na qual você deseja começar a procurar o padrão (o valor padrão é 1, o que significa começar do início da string).
- O número que especifica qual ocorrência da substring correspondente você gostaria de ver (o valor padrão é
1
, o que significa que a primeira substring correspondente deve ser mostrada).
Em nosso exemplo, a string a ser pesquisada é '
An example sentence.
' Na string, você procura por substrings que são palavras, que definimos aqui como quaisquer grupos de quaisquer caracteres, exceto espaços. É por isso que especificamos o padrão '[^ ]+
', ou seja, qualquer sequência de caracteres sem espaço. [^ ]
significa qualquer caractere exceto espaço, e o +
sinal representa uma ou mais ocorrências de tais caracteres. O terceiro argumento deve ser o padrão (1
), pois você deseja procurar palavras em toda a string desde o início. O último argumento é o mais complicado – você precisa que seu valor mude para cada string a ser pesquisada. Deve ser nível - uma pseudocoluna disponível em consultas hierárquicas usando CONNECT BY
– que, no nosso caso, será igual ao número da linha da linha atual no resultado quando CONNECT BY for usado. Então você tem:REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
Esta expressão deve ser selecionada de
dual
– uma pseudotabela usada no Oracle quando você não seleciona de uma tabela real. Então, você deve CONNECT BY
o operador de consultas hierárquicas, com a condição de que a substring recuperada não seja NULL
. A substring recuperada será NULL quando todas as palavras forem recuperadas; a consulta hierárquica interromperá a execução. Então você tem:FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
Você pode ler aqui sobre o nível e CONNECT BY.
Se você quiser dividir a string por algum outro delimitador, poderá modificar facilmente a consulta. Por exemplo, se você quiser dividir a string por vírgula, altere '
[^ ]
+' para '[^,]+
'. Aqui está um exemplo de consulta: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;