janius Postado Novembro 23, 2013 Denunciar Share Postado Novembro 23, 2013 (editado) Estou precisando de um comando em POSTGRESQL para modificar nomes próprios de pessoas deixando da forma como mostrado abaixo: Desde já agradeço! Editado Novembro 23, 2013 por janius Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gigabyte Postado Novembro 23, 2013 Denunciar Share Postado Novembro 23, 2013 Olá Janius, Dá pra fazer com um comando só: SELECT regexp_replace(nome, '(.*) (.*)', '\2, \1') FROM <tabela> Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kakao Postado Novembro 23, 2013 Denunciar Share Postado Novembro 23, 2013 (editado) Desta forma fica genérico para qualquer número de partes no nome:drop table if exists teste; create table teste ( id integer, nome text ); insert into teste (id, nome) values (1, 'Julio Cezar Andrade'), (2, 'Fenando Henrique Cardoso'), (3, 'Antonio Carlos Magalhães'), (4, 'Pedro Álvares Cabral'); select id, nome[array_length(nome, 1)] || ', ' || array_to_string(nome[1: array_length(nome, 1) - 1], ' ') as nome from ( select id, regexp_split_to_array(nome, '\s+') as nome from teste ) s; id | nome ----+--------------------------- 1 | Andrade, Julio Cezar 2 | Cardoso, Fenando Henrique 3 | Magalhães, Antonio Carlos 4 | Cabral, Pedro Álvares Editado Novembro 23, 2013 por Kakao Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 janius Postado Novembro 26, 2013 Autor Denunciar Share Postado Novembro 26, 2013 (editado) Bom dia, Kakao, o resultado do seu comando está saindo assim: "nome_formatado" é a coluna com os resultados da aplicação do comando acima. "nome" são os nomes originais. Agradeço muito a todos pelo apoio. Editado Novembro 26, 2013 por janius Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gigabyte Postado Novembro 26, 2013 Denunciar Share Postado Novembro 26, 2013 (editado) Olá janius. Insisto na utilização do regexp_replace, que utilizando a tabela criada pelo Kakao, retorna no formato desejado: drop table if exists teste; create table teste ( id integer, nome text ); insert into teste (id, nome) values (1, 'Julio Cezar Andrade'), (2, 'Fenando Henrique Cardoso'), (3, 'Antonio Carlos Magalhães'), (4, 'Pedro Álvares Cabral'), (5, 'Eduardo Henrique Cunha de Farias'); SELECT nome, regexp_replace(nome, '(.*) (.*)', '\2, \1') AS nome_formatado FROM teste; "Julio Cezar Andrade";"Andrade, Julio Cezar" "Fenando Henrique Cardoso";"Cardoso, Fenando Henrique" "Antonio Carlos Magalhães";"Magalhães, Antonio Carlos" "Pedro Álvares Cabral";"Cabral, Pedro Álvares" "Eduardo Henrique Cunha de Farias";"Farias, Eduardo Henrique Cunha de" ... Editado Novembro 26, 2013 por Gigabyte Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kakao Postado Novembro 26, 2013 Denunciar Share Postado Novembro 26, 2013 Kakao, o resultado do seu comando está saindo assim:Mostre o código usado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kakao Postado Novembro 26, 2013 Denunciar Share Postado Novembro 26, 2013 Acho que peguei o problema. Parece que há espaços antes e depois dos nomes. Então usei a função trim: drop table if exists teste; create table teste ( id integer, nome text ); insert into teste (id, nome) values (1, 'Julio Cezar Andrade'), (2, 'Fenando Henrique Cardoso'), (3, 'Antonio Carlos Magalhães'), (4, 'Pedro Álvares Cabral'), (5, 'Eduardo Henrique Cunha de Farias'), (6, 'Maria Lúcia da Silva Nunes'); select id, nome[array_length(nome, 1)] || ', ' || array_to_string(nome[1: array_length(nome, 1) - 1], ' ') as nome from ( select id, regexp_split_to_array(trim(both from nome), '\s+') as nome from teste ) s; id | nome ----+----------------------------------- 1 | Andrade, Julio Cezar 2 | Cardoso, Fenando Henrique 3 | Magalhães, Antonio Carlos 4 | Cabral, Pedro Álvares 5 | Farias, Eduardo Henrique Cunha de 6 | Nunes, Maria Lúcia da Silva No caso do Crhisnir parece que há um espaço entre "Damas" e "ceno" e neste caso não há o que fazer a não ser editar um a a um. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kakao Postado Novembro 26, 2013 Denunciar Share Postado Novembro 26, 2013 (editado) O código do Gigabyte fica mais simples mas com duas alterações:select id,nome, regexp_replace(trim(both from nome), '(.*)\s+(.*)', '\2, \1') as nome_formatado from teste; A primeira é o trim e a segunda é substituir o espaço na regexp por \s+ para o caso de haver mais de um espaço separando as partes.A expressão regular talvez seja mais lenta mas acho que mesmo assim vale a pena pela simplicidade. Editado Novembro 26, 2013 por Kakao Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 janius Postado Novembro 27, 2013 Autor Denunciar Share Postado Novembro 27, 2013 (editado) Obrigado mais uma vez Gigabyte e Kakao, seguem as saídas: --------------------------------------------------------------------------------------------------------------------------------------- Kakao: ==> Saída para o comando: select id,nome[array_length(nome, 1)] || ', ' ||array_to_string(nome[1: array_length(nome, 1) - 1], ' ')as nomefrom (select id, regexp_split_to_array(trim(both from nome), '\s+') as nomefrom teste) s; >> Não sei porque isto está acontecendo mas onde tem a letra "s" está cortando. Além disso em alguns nomes não estão sendo formatados. --------------------------------------------------------------------------------------------------------------------------------------- Gigabyte ==> Saída para o comando: SELECT nome, regexp_replace(nome, '(.*) (.*)', '\2, \1') AS nome_formatado FROM teste; >> Está retornando apenas vírgulas. ==> Saída para o comando (este comando foi sugerido por você e adaptado por Kakao): selectid,nome,regexp_replace(trim(both from nome), '(.*)\s+(.*)', '\2, \1') as nome_formatadofrom teste; >> Está retornando alternadamente vírgulas e nome sem formatação alguma. :: Infelizmente ainda não consigo obter a saída desejada :-( Valeu camaradas. Editado Novembro 27, 2013 por janius Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kakao Postado Novembro 27, 2013 Denunciar Share Postado Novembro 27, 2013 Nas versões anteriores à 9.1 tem que fazer assim: select id,nome, regexp_replace(trim(both from nome), E'(.*)\\s+(.*)', E'\\2, \\1') as nome_formatado from teste; Qual versão você está usando? select version(); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 janius Postado Novembro 27, 2013 Autor Denunciar Share Postado Novembro 27, 2013 (editado) FUNCIONOOOU! Agora deu certo. Era problema da versão mesmo (PostgreSQL 8.4.17) Obrigado Kakao e Gigabyte. Agora só mais uma coisa se num for abusar muito: Existem alguns nomes que terminam com: >> grau de parentesco: (ex.: Jânio Cesar Almeida Filho, João da Silva Souza Neto, José Soares Sobrinho) >> com "Junior" (ex: Jose Ferreira Souza Júnior) Estes devem começar com os DOIS ÚLTIMOS NOMES (ficando assim): Almeida Filho, Jânio Cesar Souza Neto, João da Silva Soares Sobrinho, José Souza Júnior, Jose Ferreira Como ficaria o comando neste caso? Editado Novembro 27, 2013 por janius Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
janius
Estou precisando de um comando em POSTGRESQL para modificar nomes próprios de pessoas deixando da forma como mostrado abaixo:
Desde já agradeço!
Editado por janiusLink para o comentário
Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.