Extrair somente números com SQL puro - sem UDF sem Stored Procedure

Este artigo tem por objetivo apresentar uma solução alternativa de como, por exemplo, extrair somente números de um campo usando apenas SQL puro, sem usar uma UDF ou Stored Procedure. A idea é simples: dado um campo com 15 caracteres, fazendo u

Este artigo tem por objetivo apresentar uma solução alternativa de como, por exemplo, extrair somente números de um campo usando apenas SQL puro, sem usar uma UDF ou Stored Procedure.

A idea é simples: dado um campo com 15 caracteres, fazendo uso de CASE WHEN E SUBSTRING, pegamos cada caracter e testamos se ele está no conjunto [0..9].

Se estiver, concatenamos com o próximo caracter e, se não estiver, concatenamos vazio '' com o próximo caracter.

Para tanto usamos duas instruções SQL.

A instrução UPDATE irá atualizar o campo CLASSIFICACAOFISCALFIXO, para cada registro em que CLASSIFICACAOFISCALFIXO não for nulo, com o resultado do SELECT que retorna somente números.

Ainda para o SELECT, dado que ambas instruções operaram sobre a mesma tabela, fizemos uso do ALIAS, permitindo uma condição where para que, a cada registro da instrução UPDATE, possamos pegar no SELECT exatamente o mesmo registro somente com o campo para o qual desejamos extrair só números e aplicar nossa regra de extração sobre este campo deste registro.

Com isto, conseguimos passar o resultado do SELECT como parâmetro para o UPDATE.

Veja dois exemplos, o primeiro sobre a tabela MP (matéria-prima) e o segundo sobre a tabela PRODUTOFINAL (produto final)

UPDATE MP SET MP.CLASSIFICACAOFISCALFIXO = (SELECT CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 1 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 1 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 2 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 2 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 3 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 3 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 4 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 4 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 5 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 5 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 6 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 6 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 7 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 7 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 8 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 8 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 9 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 9 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 10 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 10 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 11 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 11 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 12 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 12 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 13 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 13 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 14 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 14 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 15 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(M.CLASSIFICACAOFISCALFIXO FROM 15 FOR 1) ELSE '' END AS SO_NUMERO FROM MP M WHERE M.CODIGO=MP.CODIGO) WHERE MP.CLASSIFICACAOFISCALFIXO IS NOT NULL<

Acompanhe o resultado prático na imagem abaixo:

UPDATE PRODUTOFINAL SET PRODUTOFINAL.CLASSIFICACAOFISCALFIXO = (SELECT CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 1 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 1 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 2 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 2 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 3 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 3 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 4 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 4 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 5 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 5 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 6 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 6 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 7 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 7 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 8 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 8 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 9 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 9 FOR 1) ELSE '' END || CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 10 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 10 FOR 1) ELSE '' END | | CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 11 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 11 FOR 1) ELSE '' END | | CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 12 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 12 FOR 1) ELSE '' END | | CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 13 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 13 FOR 1) ELSE '' END | | CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 14 F OR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 14 FOR 1) ELSE '' END | | CASE WHEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 15 FOR 1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTRING(P.CLASSIFICACAOFISCALFIXO FROM 15 FOR 1) ELSE '' END AS SO_NUMERO FROM PRODUTOFINAL P WHERE P.CODIGO = PRODUTOFINAL.CODIGO) WHERE PRODUTOFINAL.CLASSIFICACAOFISCALFIXO IS NOT NULL

Acompanhe o resultado prático na imagem abaixo:

Esses exemplos podem ser usados como base para criar outros tipos de filtros de carater.

O único inconveniente é que, para cada carater, escrevemos um CASE WHEN. E o pró é que é muito simples, puro sql e sem a necessidade de criar algo no banco e depois fazer DROP.

Ao fazer manutenção em um banco de dados pode fazer parte de um script.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados