segunda-feira, 14 de fevereiro de 2011

Formatando nomes, colocando iniciais em maiúsculas e demais em minúsculas

É raro, mas, as vezes acontece de que o DBA Postgres, ter que adaptar um estrutura de nomes em uma ou mais tabelas, com iniciais em maiúsculas e demais e minúsculas, aqui segue um store function para fazer esse moido.

--
-- Nome Artefato/Programa..: sf_formata_nome.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann@gmail.com) 
-- Data Inicio ............: 07/02/2011
-- Data Atual..............: 14/02/2011
-- Versao..................: 0.01
-- Compilador/Interpretador: PostgreSql
-- Sistemas Operacionais...: Linux/Windows
-- SGBD....................: PostgreSql 9.x
-- Kernel..................: Nao informado!
-- Finalidade..............: store function para formata um nome, colocando iniciais em maiúsculas e demais em minúsculas
-- OBS.....................: uso de função de agregacao array_agg funciona no PG 8.4 / 9.0, substituir por array_accum no PG anterior a essas versões .
--

-- Apaga function se existir 
DROP FUNCTION IF EXISTS sf_formata_nome(text);
CREATE OR REPLACE FUNCTION sf_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 sf_formata_nome(text) IS 'Função que formata um nome, colocando iniciais em maiúsculas e demais em minúsculas';

SELECT sf_formata_nome('JOSE E SILVA DE LIRA DOS SANTOS');

Nenhum comentário:

Postar um comentário