Eu postei o mesmo no stackoverflow (por favor, deixe-me saber se eu tiver que deletar um).
Estou trabalhando em um banco de dados DB2 e, pelo que posso ver, o regexp não é suportado (sem bibliotecas adicionais).
Portanto, não posso implementar algo semelhante ao que é explicado neste artigo " Trazendo o poder da correspondência de expressões regulares para SQL "
Você sabe se eu posso "emular", com uma instrução SQL, uma expressão regular como essa?
^a[aofdmep]{1}[az]{1}[a-z0-9]{4}[sidbfkfpo]{1}
Editar
Na hipótese acima, descobri que é aceitável para o meu caso um predicado WHERE Like:
WHERE USER_NAME NÃO LIKE 'a_______'
Mas é inseguro e não cobre outros casos em que não tenho um char fixo que possa corresponder.
Como essa velha questão foi desenterrada de qualquer maneira, mencionarei que você pode usar o suporte XQuery embutido no DB2 para correspondência de expressão regular, algo na linha de
XMLQUERY
acima chama a função XQuerymatches
na colunaUSER_NAME
. O resultado é um XMLboolean
, portanto,XMLCAST
é usado para convertê-lo em um tipo de dados SQL.Em primeiro lugar, os
{1}
s são redundantes, então é realmente apenas:Na verdade, este é um padrão bem simples ... é apenas observar quais são os primeiros 8 caracteres da string, e é sempre uma string de comprimento fixo, então você poderia construir uma tabela de todas as permutações e, em seguida, fazer:
Infelizmente, é 7*26*36^4*9... 2,75 bilhões de combinações possíveis, mas, ainda assim, strings fixas, então você poderia fazer:
(preencher os
...
bits, é claro)oops, há dois
f
s nessa última classe de caractere, então há apenas 2,45 bilhões de permutações.Não vou fingir que vai ser rápido... provavelmente não vai ser, mas vai te dar o padrão que você está procurando. Se você costuma fazer muito isso, provavelmente criaria uma tabela de caracteres para que você tivesse uma maneira fácil de selecionar alfa/numérico ou alfanumérico.
Com base nas respostas de Leigh Riffel e Joe, você pode considerar o uso de LIKE quando tiver uma longa lista de caracteres individuais ou quando tiver vários intervalos de caracteres.
Como você usa a mesma lista de caracteres várias vezes, também pode considerar o uso de uma coluna constante CROSS JOINed.
Não é necessário para o seu exemplo, mas a "tabela" CROSS JOINed pode definir várias colunas de classes de caracteres nomeados.
REGEXP_LIKE agora está disponível no DB2 para iSeries - consulte: http://www.itjungle.com/fhg/fhg051915-story01.html
No DB2 para z/OS, o SQL incluiria PASSING da seguinte forma