- Este tópico contém 8 respostas, 5 vozes e foi atualizado pela última vez 15 anos, 11 meses atrás por
Itimura.
-
AutorPosts
-
7 de abril de 2010 às 6:34 pm #93560
Itimura
ParticipanteGalera
Bom dia
preciso fazer um update para atualizar o cadastro de clientes de uma empresa
O campo Endereço foi cadastrado de forma errada por eles sendo:
Errado
AV Marechal Tito, 876todas essas informações foram colocadas dentro do campo “ENDERECO” e o numero do estabelecimento não foi informado no campo ‘NUMERO” no qual esta em branco
se todos os endereços fosse com 3 digitos referente ao numero seria um pouco mais fácil, mas como existem endereços que possuem NUMERO do estabelecimento com mais de 3 digitos ou menos eu não consegui fazer..
alguem tem uma idéia de como fazer?
Obrigadoo
7 de abril de 2010 às 7:04 pm #93561Leonardo Litz
ParticipanteSe a formatação é sempre essa esta bem fácil, divida o nome da rua até a virgula e o número após ela.
Vlw Leonardo Litz
7 de abril de 2010 às 7:06 pm #93562Itimura
ParticipanteOlá!
então pensei nessa lógica também, mas infelizmente tecnicamente falando eu não sei fazer… to aprendendo ja faz uns meses mas ainda não conheço a fundo
ajuda?
7 de abril de 2010 às 7:11 pm #93563burga
ParticipanteSe o número sempre é a ultima cadeia de caracteres da sua atring e sempre existe um espaço antes dele, você pode fazer assim:
select substr(trim('AV Marechal Tito, 876'),INSTR(trim('AV Marechal Tito, 876'),' ', -1, 1)+1)
from dual;O mesmo vale para a lógica do Litz, se sempre existir uma virgula antes do número, você pode substiruir o espaço por uma vírgula na função instr.
8 de abril de 2010 às 12:06 am #93568Itimura
Participanteentão, minha dpuvida tecnica seria:
Como fazer um update no campo numero com o valor do numero que esta atribuido ao endereco.
o campo esta na mesma tabela Clientes
8 de abril de 2010 às 12:34 am #93569burga
ParticipantePrimeiro você tem que definir as regras de extração do número. Um exemplo seria a sugestão do Leonardo em relação às vírgulas, outro seria pegar tudo que vem depois do último espaço, do jeito que eu fiz na mensagem anterior.
Assim você faria:
UPDATE TABELA
SET NUMERO = substr(trim(ENDERECO),INSTR(trim(ENDERECO),' ', -1, 1)+1)
WHERE NUMERO IS NULL AND ENDERECO IS NOT NULL;sendo que:
ENDERECO = campo que contem os valores de rua+numero;
NUMERO = campo que você quer popular;
TABELA = nome da tabela.Entendeu? é Só definir as regras de extração do número que o restante fica fácil, utilizando as funções do Oracle SUBSTR e INSTR.
No código acima eu utilizei a regra de pegar a ultima cadeia de caracteres após o ultimo caracter de espaço e considerar isso como o número do endereço.
8 de abril de 2010 às 1:36 am #93571fsitja
Participante[quote=”Litz”:gp2jgxgt]Se a formatação é sempre essa esta bem fácil, divida o nome da rua até a virgula e o número após ela.
Vlw Leonardo Litz[/quote]
hehe Lei de Murphy, pode crer que não é 😆Eu tinha implementado algo assim uma vez, para fazer “faxina” em campo de endereço.
No exemplo, crio uma tabela bagunçada com tudo no mesmo campo.
Daí com um SQL separo o campo descritivo em 3 colunas:
– logradouro
– número
– complementoSugestão seria usar expressões regulares. Dê uma olhada no exemplo que fiz abaixo:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as fsitjaSQL>
SQL> create table tab_endereco (endereco varchar2(1000),
2 logradouro varchar2(1000),
3 numero number(10),
4 complemento varchar2(100));Table created
SQL> begin
2 insert into tab_endereco (endereco) values ('AV SERTORIO, 6600');
3 insert into tab_endereco (endereco) values ('AV SERTORIO, 6600 SOBRELOJA');
4 insert into tab_endereco (endereco) values ('RUA BOM JESUS, 159');
5 insert into tab_endereco (endereco) values ('RUA SERGIO DIETRICH, S/N');
6 insert into tab_endereco (endereco) values ('AV PARAGUACU, 2578');
7 insert into tab_endereco (endereco) values ('RUA BARAO DO RIO BRANCO 159');
8 insert into tab_endereco (endereco) values ('AV. PERIMETRAL Nº 12 apt. 202');
9 insert into tab_endereco (endereco) values ('AV. PERIMETRAL (Nº) 12 apt. 202');
10 commit;
11 end;
12 /PL/SQL procedure successfully completed
SQL> select endereco,
2 regexp_replace(substr(t.endereco,1,
3 decode(regexp_instr(t.endereco, 'd+', 1, 1, 0, 'i')
4 , 0, length(t.endereco) + 1,
5 regexp_instr(t.endereco, 'd+', 1, 1, 0, 'i'))
6 - 1)
7 , '[,]s$', '') logradouro,
8 regexp_substr(t.endereco, 'd+', 1, 1, 'i') numero,
9 ltrim(regexp_substr(t.endereco, '.+',
10 decode(regexp_instr(t.endereco, 'd+', 1, 1, 1, 'i'),
11 0,
12 length(t.endereco)+1,
13 regexp_instr(t.endereco, 'd+', 1, 1, 1, 'i'))
14 , 1, 'i')) complemento
15 from tab_endereco t;ENDERECO LOGRADOURO NUMERO COMPLEMENTO
AV SERTORIO, 6600 AV SERTORIO 6600
AV SERTORIO, 6600 SOBRELOJA AV SERTORIO 6600 SOBRELOJA
RUA BOM JESUS, 159 RUA BOM JESUS 159
RUA SERGIO DIETRICH, S/N RUA SERGIO DIETRICH, S/N
AV PARAGUACU, 2578 AV PARAGUACU 2578
RUA BARAO DO RIO BRANCO 159 RUA BARAO DO RIO BRANCO 159
AV. PERIMETRAL Nº 12 apt. 202 AV. PERIMETRAL Nº 12 apt. 202
AV. PERIMETRAL (Nº) 12 apt. 202 AV. PERIMETRAL (Nº) 12 apt. 2028 rows selected
SQL>
O passo seguinte seria fazer um update na tabela e popular as colunas:
SQL> update tab_endereco t
2 set logradouro = (regexp_replace(substr(t.endereco,1,
3 decode(regexp_instr(t.endereco, 'd+', 1, 1, 0, 'i')
4 , 0, length(t.endereco) + 1,
5 regexp_instr(t.endereco, 'd+', 1, 1, 0, 'i'))
6 - 1)
7 , '[,]s$', '')),
8 numero = regexp_substr(t.endereco, 'd+', 1, 1, 'i'),
9 complemento = ltrim(regexp_substr(t.endereco, '.+',
10 decode(regexp_instr(t.endereco, 'd+', 1, 1, 1, 'i'),
11 0,
12 length(t.endereco)+1,
13 regexp_instr(t.endereco, 'd+', 1, 1, 1, 'i'))
14 , 1, 'i'));8 rows updated
SQL> select * from tab_endereco;ENDERECO LOGRADOURO NUMERO COMPLEMENTO
AV SERTORIO, 6600 AV SERTORIO 6600
AV SERTORIO, 6600 SOBRELOJA AV SERTORIO 6600 SOBRELOJA
RUA BOM JESUS, 159 RUA BOM JESUS 159
RUA SERGIO DIETRICH, S/N RUA SERGIO DIETRICH, S/N
AV PARAGUACU, 2578 AV PARAGUACU 2578
RUA BARAO DO RIO BRANCO 159 RUA BARAO DO RIO BRANCO 159
AV. PERIMETRAL Nº 12 apt. 202 AV. PERIMETRAL Nº 12 apt. 202
AV. PERIMETRAL (Nº) 12 apt. 202 AV. PERIMETRAL (Nº) 12 apt. 2028 rows selected
SQL>
Só tem um problema: Se você tiver nomes de rua como “7 de setembro”, “15 de novembro”, você vai precisar corrigir essas linhas
antes de rodar esse procedimento que postei acima. Seria um procedimento simples, de mapear os nomes de ruas que
contenham números para nomes com os números por extenso.Depois funciona tudo numa boa
13 de abril de 2010 às 7:24 pm #93631wagnerbian
ParticipanteExcelente post, parabéns fsitja.
😉
13 de abril de 2010 às 9:13 pm #93633Itimura
ParticipanteEle é o cara!
-
AutorPosts
- Você deve fazer login para responder a este tópico.