lunes, 7 de septiembre de 2015

Separating Names in PostgreSQL

/*

select sp_separar_nombres('Jose Francisco Rodriguez Chavez', 1);
select sp_separar_nombres('Jose Francisco Rodriguez Chavez', 2);
select sp_separar_nombres('Jose Francisco Rodriguez Chavez', 3);
select sp_separar_nombres('Jose Francisco Rodriguez Chavez', 4);

select sp_separar_nombres('Helen Vilchez', 1);
select sp_separar_nombres('Helen Vilchez', 2);
select sp_separar_nombres('Helen Vilchez', 3);
select sp_separar_nombres('Helen Vilchez', 4);

select sp_separar_nombres('Katherine Diaz Tabora', 1);
select sp_separar_nombres('Katherine Diaz Tabora', 2);
select sp_separar_nombres('Katherine Diaz Tabora', 3);
select sp_separar_nombres('Katherine Diaz Tabora', 4);

*/

create or replace function sp_separar_nombres(completo varchar, parcial int)
returns varchar
as $$
declare
    v_primer_nom varchar = '';
    v_segundo_nom varchar = '';
    v_primer_apel varchar = '';
    v_segundo_apel varchar = '';
begin
    v_primer_nom = substring(completo, 0, position(' ' in completo));

    v_segundo_nom = trim(replace(completo, v_primer_nom, ''));
    v_segundo_nom = substring(v_segundo_nom, 0, position(' ' in v_segundo_nom));

    v_primer_apel = trim(replace(completo, v_primer_nom, ''));
    v_primer_apel = trim(replace(v_primer_apel, v_segundo_nom, ''));
    v_primer_apel = substring(v_primer_apel, 0, position(' ' in v_primer_apel));

    v_segundo_apel = trim(replace(completo, v_primer_nom, ''));
    v_segundo_apel = trim(replace(v_segundo_apel, v_segundo_nom, ''));
    v_segundo_apel = trim(replace(v_segundo_apel, v_primer_apel, ''));
    v_segundo_apel = substring(v_segundo_apel, 0, length(v_segundo_apel) + 1);

    if (v_segundo_nom = '' and v_primer_apel = '') then
        v_primer_apel = v_segundo_apel;
        v_segundo_apel = '';
    end if;

    if (v_segundo_nom <> '' and v_primer_apel = '') then
        v_primer_apel = v_segundo_nom;
        v_segundo_nom = '';
    end if;

    if (parcial = 1) then
        return v_primer_nom;
    end if;

    if (parcial = 2) then
        return v_segundo_nom;
    end if;

    if (parcial = 3) then
        return v_primer_apel;
    end if;

    if (parcial = 4) then
        return v_segundo_apel;
    end if;

    if (parcial < 1 and parcial > 4) then
        return '';
    end if;
end;
$$ language plpgsql;

No hay comentarios:

Publicar un comentario