Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como dividir uma string no Oracle

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;