Ir para conteúdo
Fórum Script Brasil
  • 0

Comando para modificar ordem de nome próprio PostgreSQL


janius

Pergunta

10 respostass a esta questão

Posts Recomendados

  • 0

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 por Kakao
Link para o comentário
Compartilhar em outros sites

  • 0

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 por Gigabyte
Link para o comentário
Compartilhar em outros sites

  • 0

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.
Link para o comentário
Compartilhar em outros sites

  • 0

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 por Kakao
Link para o comentário
Compartilhar em outros sites

  • 0

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 nome
from (
select id, regexp_split_to_array(trim(both from nome), '\s+') as nome
from teste
) s;

kakao_trim.png

>> 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):

select
id,nome,
regexp_replace(trim(both from nome), '(.*)\s+(.*)', '\2, \1') as nome_formatado
from teste;

kakao_Gigabyte_trim.png

>> Está retornando alternadamente vírgulas e nome sem formatação alguma.

:: Infelizmente ainda não consigo obter a saída desejada :-(

Valeu camaradas.

Editado por janius
Link para o comentário
Compartilhar em outros sites

  • 0

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 por janius
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...