Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Duvida usando a funçao SUBSTRING de um campos sem padrão na descrição

Ola, tudo bem? No vídeo aprendemos usar a função SUBSTRING para extrair a Cidade e Estado, porém o campo endereço estava com a descrição padronizada com "-" separando a cidade do estado.

Ex. Caminho Foz do Jordão, 25 - Brasília - DF

R. Dois de Fevereiro, 1354 - Goiais - GO

R. Cel. Laurênio Lago, 355 - Campinas - SP

R. Laurindo Rabêlo, 149 - Campo Grande - MS

SUBSTRING([ENDERECO], FINDSTRING([ENDERECO],"-",1) + 2, 50) = Separa a Cidade junto com o estado do campo endereco

SUBSTRING([CIDADE_ESTADO], 1, FINDSTRING([CIDADE_ESTADO],"-",1) - 2) = Separa a cidade do campo cidade_estado

SUBSTRING([CIDADE_ESTADO], FINDSTRING([CIDADE_ESTADO],"-",1) + 2, 50) = Separa o estado do campo cidade_estado.

Até ai tudo ok, mas como posso usar a SUBSTRING para separar a cidade e estado no exemplo abaixo onde a String não esta padronizada?

Caminho Foz do Jordão, 25 Brasília DF

R. Dois de Fevereiro, 1354 - Go.Goiais

R. Cel. Laurênio Lago, 355 Campinas.SP

R. Laurindo Rabêlo, 149 - MS Campo Grande

Obrigado!! Huender

2 respostas
solução!

Huender

Não vejo como. O SUBSTRING necessita de uma posição bem determinada. Ou esta posição é definida por você ou usa-se uma regra para faze-la.

No seu exemplo podemos tomar, como padrão, a vírgula. Sabemos que, após a vírgula temos um número e em seguida a cidade com o estado (Sei que isso não seria uma regra, Podemos ter um número e um complemento). Mas ele seria o ponto de partida.

Existem algumas técnicas de ETL clamadas DATA CLEASING onde temos, uma tabela de valores padrões (Ex: Estado s e cidade) e percorreríamos cada registro da tabela procurando por estas cidades e estados e retirando eles do campo original.

Veja o script abaixo em SQL SERVER. Se quiser crie um banco no seu SQL SERVER e execute os comandos abaixo e veja o resultado. (Se for da primeira vez 4 comandos DROPs devem ser desprezados)

DROP TABLE ENDERECOS
DROP TABLE CIDADES
DROP TABLE ESTADOS
DROP TABLE RESULTADO

CREATE TABLE ENDERECOS (ENDERECO VARCHAR(200) NULL)
CREATE TABLE CIDADES (CIDADE VARCHAR(200) NULL)
CREATE TABLE ESTADOS (ESTADO VARCHAR(200) NULL)
CREATE TABLE RESULTADO (RUA VARCHAR(200), CIDADE VARCHAR(200), ESTADO VARCHAR(200))

INSERT INTO CIDADES (CIDADE) VALUES ('RIO DE JANEIRO')
INSERT INTO CIDADES (CIDADE) VALUES ('SÃO PAULO')
INSERT INTO CIDADES (CIDADE) VALUES ('GOIAIS')
INSERT INTO CIDADES (CIDADE) VALUES ('CAMPINAS')
INSERT INTO CIDADES (CIDADE) VALUES ('CAMPO GRANDE')
INSERT INTO CIDADES (CIDADE) VALUES ('NITERÓI')
INSERT INTO CIDADES (CIDADE) VALUES ('BRASÍLIA')

INSERT INTO ESTADOS (ESTADO) VALUES ('RJ')
INSERT INTO ESTADOS (ESTADO) VALUES ('SP')
INSERT INTO ESTADOS (ESTADO) VALUES ('GO')
INSERT INTO ESTADOS (ESTADO) VALUES ('RS')
INSERT INTO ESTADOS (ESTADO) VALUES ('MS')
INSERT INTO ESTADOS (ESTADO) VALUES ('DF')
INSERT INTO ESTADOS (ESTADO) VALUES ('AM')

INSERT INTO ENDERECOS (ENDERECO) VALUES ('Caminho Foz do Jordão, 25 Brasília DF')
INSERT INTO ENDERECOS (ENDERECO) VALUES ('R. Dois de Fevereiro, 1354 - Go.Goiais')
INSERT INTO ENDERECOS (ENDERECO) VALUES ('R. Cel. Laurênio Lago, 355 Campinas.SP')
INSERT INTO ENDERECOS (ENDERECO) VALUES ('R. Laurindo Rabêlo, 149 - MS Campo Grande')

DECLARE @POS INT
DECLARE @RUA VARCHAR(200)
DECLARE @ENDERECO VARCHAR(200)
DECLARE @COMPLEMENTO VARCHAR(200)
DECLARE @COMPLEMENTO2 VARCHAR(200)
DECLARE @ESTADO VARCHAR(200)
DECLARE @CIDADE VARCHAR(200)
DECLARE DB_CURSOR CURSOR FOR SELECT ENDERECO FROM ENDERECOS
OPEN DB_CURSOR  
FETCH NEXT FROM DB_CURSOR INTO @ENDERECO  
WHILE @@FETCH_STATUS = 0  
BEGIN  
     SET @POS = CHARINDEX(',',@ENDERECO,1)
     SET @RUA = SUBSTRING(@ENDERECO, 1, @POS - 1)
     SET @COMPLEMENTO = SUBSTRING(@ENDERECO, @POS + 1, LEN(@ENDERECO) - @POS)
     SET @POS = CHARINDEX(' ',@COMPLEMENTO,2)
     SET @COMPLEMENTO2 = SUBSTRING(@COMPLEMENTO, @POS + 1, LEN(@COMPLEMENTO) - @POS)

     SELECT TOP 1 @ESTADO = ESTADO FROM ESTADOS WHERE CHARINDEX(ESTADO,UPPER(@COMPLEMENTO2),1) > 0
     SELECT TOP 1 @CIDADE = CIDADE FROM CIDADES WHERE CHARINDEX(CIDADE,UPPER(@COMPLEMENTO2),1) > 0
         INSERT INTO RESULTADO (RUA, CIDADE, ESTADO) VALUES (@RUA, @CIDADE, @ESTADO)

     FETCH NEXT FROM DB_CURSOR INTO @ENDERECO
END 
CLOSE DB_CURSOR
DEALLOCATE DB_CURSOR  

SELECT * FROM ENDERECOS
SELECT * FROM RESULTADO

Att

Victorino Vila

Perfeito Victorino, executei o script e deu certo! Essa era exatamente minha dúvida.

Muito Obrigado!! Abraços Huender