› Fóruns › SQL e PL/SQL › Ajuda para Update no campo endereço › Ajuda para Update no campo endereço
[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
– complemento
Sugestã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 fsitja
SQL>
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. 202
8 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. 202
8 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