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:

img

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:

img

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.