Pular para o conteúdo
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #93560
    Itimura
    Participante

      Galera

      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, 876

      todas 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

      #93561
      Avatar photoLeonardo Litz
      Participante

        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

        #93562
        Itimura
        Participante

          Olá!

          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?

          #93563
          burga
          Participante

            Se 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.

            #93568
            Itimura
            Participante

              entã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

              #93569
              burga
              Participante

                Primeiro 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.

                #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

                  #93631
                  wagnerbian
                  Participante

                    Excelente post, parabéns fsitja.

                    😉

                    #93633
                    Itimura
                    Participante

                      Ele é o cara!

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.