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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo