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 !
Emerson Hermann
Em 9 de fevereiro de 2011 21:00, Beto Lima <[email protected]> escreveu:
> Acredito então que não há jeito mesmo em deixar 100%.
> sobre ter uma lista de valores pra comparações, não teria idéia de
> como ficaria...
> mas agradeço a todos pelas dicas....
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral