Em 10/02/11, Emerson Hermann<[email protected]> escreveu:
> Sem expressão regular eu faria asim, funciona no PG 9.0,  para
> funcionar  no PG 8.x, teria que mudar o array_agg por array_acuum
> Criei uma store function apenas para simplificar o uso
>
> DROP FUNCTION IF EXISTS sp_formata_nome(text);
> CREATE OR REPLACE FUNCTION sp_formata_nome(var text) RETURNS TEXT AS
> $body$
> SELECT array_to_string(array_agg(nomes),' ')
>   FROM
>      (
>        SELECT CASE WHEN lower(x.id_unico[i]) = 'de' THEN
>                       lower(x.id_unico[i])
>                    WHEN lower(x.id_unico[i]) = 'dos' THEN
>                       lower(x.id_unico[i])
>                    WHEN lower(x.id_unico[i]) = 'da' THEN
>                       lower(x.id_unico[i])
>                    WHEN lower(x.id_unico[i]) = 'e' THEN
>                       lower(x.id_unico[i])    
>                    ELSE
>                       upper(substring(x.id_unico[i],1,1)) ||
> lower(substring(x.id_unico[i],2))
>               END AS nomes
>          FROM
>             (
>              SELECT *
>                FROM string_to_array(cast($1 AS text),' ') AS id_unico
>             ) AS x,
>             generate_series(1,array_upper(string_to_array(cast($1 as
> text),' '),1)) AS i
>
>      ) AS x
>      ;
> $body$
> LANGUAGE 'sql';
> COMMENT ON FUNCTION sp_formata_nome(text) IS 'Função que formata um
> nome, colocando iniciais em maiúsculas e demais em minúsculas';
>
> SELECT sp_formata_nome( 'Jose da Silva e Lira dos Santos');
>
>
> Caso aconteça outras situações é só acrescentar no case when
>
> Espero ter ajudado !
>


Mas, como Leo já havia dito, com expressões regulares também é muito fácil.

bdteste=# SELECT regexp_replace(
bdteste(#           regexp_replace(initcap('DE MARCO DOS SANTOS E
SILVA DA MATA'),
bdteste(#
E'([[:space:]])D(e|as?|os?)([[:space:]])', E'\\1d\\2\\3', 'g'),
bdteste(#           E'([[:space:]])E([[:space:]])', E'\\1e\\2', 'g');
           regexp_replace
-------------------------------------
 De Marco dos Santos e Silva da Mata
(1 row)


É só acrescentar outros casos em que deseje deixar como minúscula.

Alguma dificuldade pode surgir nas considerações sobre o que deve ser
colocado como minúscula, particularmente para nomes em outras línguas,
por ex.:
Yin deve ser trocado para yin?
Mc deve ser trocado para mc?
Como tratar quando tem ', por ex.: D'EU?
etc


Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a