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.