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

REGEX para selecionar o enésimo valor de uma lista, permitindo nulos


Obrigado a quem respondeu. Depois de examinar suas respostas e as respostas no link fornecido, cheguei a esta solução:
SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
  2  from dual;

Data
----

Que pode ser descrito como "olhar para a 2ª ocorrência de um conjunto opcional de zero ou mais caracteres que são seguidos por uma vírgula ou o final da linha, e retornar o 1º subgrupo (que é o dado menos a vírgula ou o final do linha).

Esqueci de mencionar que testei com o null em várias posições, vários nulls, selecionando várias posições, etc.

A única ressalva que encontrei é se o campo que você procura for maior que o número disponível, ele apenas retornará NULL, então você precisa estar ciente disso. Não é um problema para o meu caso.

EDIT:Estou atualizando a resposta aceita para o benefício de futuros pesquisadores que possam se deparar com isso.

O próximo passo é encapsular o código para que ele possa ser transformado em uma função mais simples e reutilizável. Aqui está a fonte da função:
  FUNCTION  GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
    BEGIN
      RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
  END GET_LIST_ELEMENT;

Isso oculta as complexidades da regex dos desenvolvedores que podem não se sentir tão à vontade com ela e torna o código mais limpo de qualquer maneira quando em uso. Chame assim para obter o 4º elemento:
select get_list_element('123,222,,432,555', 4) from dual;