Pular para o conteúdo

Fóruns SQL e PL/SQL Ajuda para Update no campo endereço Ajuda para Update no campo endereço

#93571
fsitja
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
    – 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