Expressões Regulares em DB2 SQL – Regule isso!
Impressione seus colegas JAVA com as expressões regulares em DB2 SQL – Se torne um especialista em regex com essas amostras (utilização de regex no Editor TSO & regex como predicado)
As referências a blogs que focam nesse assunto ajudarão a complementar seu conhecimento sobre “Expressões Regulares em Db2 SQL” (equivalência em padrões avançados, teste regex e utilização REGEXP_LIKE)
Nunca fui um grande fã de expressões regulares (regex) porque já trabalho com Mainframe e regex sempre foi “só para aquelas caixas pequenas que você consegue levantar”, no entanto, desde o DB2 12 tenho começado a usá-las nos lugares mais inesperados.
TSO? Você está brincando?
Sim, você pode usar o regex até no editor de TSO. Ele encontrará todas as ocorrências de dados que começam com M, contém DB e terminam com pelo menos dois números. Depois do filtro (e OU em regex) faz a mesma coisa mas para linhas que começam com O, seguidas de 2DB e que terminam com dois números:
Note que mudar de R para RC faz com que o regex seja sensível aos caracteres.
Use “x all” primeiro, para então ver o que será encontrado…
Muito bacana! Naturalmente você pode utilizar quase qualquer formatos de regex, onde quer que você queira, e isso é muito poderoso. Têm suporte em Find, Change (mas não para o segundo argumento em Change) e Exclude.
Maiores informações sobre o regex
Utilização em TSO: Para maiores informações sobre o uso de TSO confira o post KC
Utilização de REXX: a utilização do Rexx também está disponível e o Martin Packer escreveu um ótimo artigo sobre uma rotina de testes Regex que você pode experimentar também:
E o Db2?
Bem… aonde é possível o regex já existia há muito tempo. Tudo isso dentro do próprio DB2. O artigo do Fred Sobotka “Padrões avançados de correspondência com Expressões Regulares em DB2 11.1 para LUW” no blog IDUG discute muitas maneiras interessantes de utiliza-los e seus irmãos e valem a pena serem lidos.
E o DB2 “de verdade”?
Bom… nós temos… quer dizer… não é exatamente o que você imagina, mas está lá. Você precisa superar alguns obstáculos e manipular dados requeridos no XML.
Como é? A lista Regex pode ser útil da seguinte forma:
Tudo bem, chega de esperar… aqui está o regex que lista as tabelas que entre 2 e 5 caracteres, de B a Z e termina em 2 numéricos:
Não vai ganhar nenhum concurso de beleza, mas… funciona!
Como funciona?
Só um bog mediano SELECT, FROM e WHERE – Nada de novo aqui!
Isso deve ser visto como duas declarações separadas, primeiro a declaração interna:
Isso “traduz” a coluna NAME num constructo XML com o nome xmltbname pronto para o regex que nós “fazemos de conta” através de um XMLEXISTS:
Esse utiliza a função fn:matches que fará o regex de fato.
Os dados no regex ^[B-Z]{2,5}[0-9]{2}$ é um regex normal e usa o xmltbname como entrada.
O fn:matches é booleano e, portanto, retorna como Verdadeiro ou Falso. Este é, então, um predicado “normal”, pois qualquer linha que seja “verdadeira” deve ter passado pelo regex.
Claro como lama!
É um pouco estranho e posso recomendar mais leituras:
Primeiro o excelente site Regex onde você pode saber mais sobre as alegrias e perigos destas “criaturas”:
E a IBM XQuery docu que descreve detalhadamente como o fn:matches funciona:
https://www.ibm.com/support/knowledgecenter/SSEPEK_12.0.0/xml/src/tpc/db2z_regularexpression.html
Os dois valem a pena de serem lidos – tome cuidado especialmente com os “quantificadores explosivos”!
CPU?
Sim, você adivinhou. Não existe almoço grátis!
A utilização desse método não é fácil.
Só deve ser utilizado somente se normal LIKE, REPLACE e TRANSLATE podem não conseguirem fazer o trabalho facilmente e se você precisa desenvolver códigos regex como: ^(?=(?!(.)1)([^DO:105-93+30])(?-1)(?<!d(?<=(?![5-90-3])d))).[^WHY?]$
Bom, não se surpreenda se seus colegas começarem a te detestar.
Fique a vontade para mandar perguntas e comentários
TTFN,
Roy Boxwell
Senior Architect