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