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;