CREATE OR REPLACE FUNCTION respuestas_pregunta(preg_id integer, ug character varying)
 RETURNS SETOF record
 LANGUAGE plpgsql
AS $function$
DECLARE
datos_pregunta record;

BEGIN

    SELECT  sp.pregunta,
            sp.tabla_asociada,
            sp.tabla_asociada_codigo,
            sp.tabla_asociada_descripcion,
            sp.componente_numero,
            sp.tabla_asociada_orden_campo,
            sp.tabla_asociada_orden_tipo,
            scp.componente
    INTO    datos_pregunta
    FROM    sge_pregunta AS sp
            JOIN sge_componente_pregunta scp ON sp.componente_numero = scp.numero
    WHERE       sp.pregunta = preg_id
            AND sp.unidad_gestion = ug;

IF datos_pregunta IS NULL THEN RETURN;
END IF;

IF (datos_pregunta.tabla_asociada IS NULL) OR (datos_pregunta.tabla_asociada = '') THEN

    RETURN QUERY
        SELECT  sp.pregunta,                    --1
                sp.nombre AS pregunta_nombre,   --2
                scp.numero AS componente_numero,--3
                scp.componente AS componente,   --4
                CASE WHEN componente IN ('check', 'list')
                    THEN 'si'
                    ELSE 'no'
                END AS opciones_multiples,      --5
                spr.respuesta AS respuesta_codigo, --6
                sr.valor_tabulado,              --7
                spr.orden AS respuesta_orden,   --8
                sp.tabla_asociada, 		--9
                sp.tabla_asociada_codigo, 	--10
                sp.tabla_asociada_descripcion	--11
        FROM    sge_pregunta AS sp
                JOIN sge_componente_pregunta AS scp ON scp.numero = sp.componente_numero
                LEFT JOIN sge_pregunta_respuesta AS spr ON (
                    CASE
                    WHEN componente IN ('radio', 'combo', 'list', 'check', 'localidad', 'combo_autocompletado', 'localidad_y_cp', 'combo_dinamico')
                        THEN sp.pregunta
                        ELSE NULL
                    END = spr.pregunta)
                LEFT JOIN sge_respuesta sr ON spr.respuesta = sr.respuesta
        WHERE       sp.pregunta = preg_id
                AND NOT componente IN ('label', 'etiqueta_titulo', 'etiqueta_texto_enriquecido')
        ORDER BY
                respuesta_orden;

ELSE

RETURN QUERY EXECUTE '
    SELECT  sp.pregunta,                    --1
            sp.nombre as pregunta_nombre,   --2
            scp.numero as componente_numero,--3
            scp.componente as componente,   --4
            CASE WHEN componente IN (''check'', ''list'')
                THEN ''si''
                ELSE ''no''
            END AS opciones_multiples,      --5
            ta.' || datos_pregunta.tabla_asociada_codigo || ' as respuesta_codigo,    --6
            ta.' || datos_pregunta.tabla_asociada_descripcion || ' as valor_tabulado, --7
            0::smallint	as respuesta_orden,   --8
            sp.tabla_asociada,                --9
            sp.tabla_asociada_codigo,         --10
            sp.tabla_asociada_descripcion     --11
    FROM    sge_pregunta sp
            JOIN sge_componente_pregunta AS scp ON scp.numero = sp.componente_numero
            LEFT JOIN ' || datos_pregunta.tabla_asociada || ' AS ta ON sp.tabla_asociada = ''' || datos_pregunta.tabla_asociada || '''
    WHERE       sp.pregunta = ' || preg_id || ' AND
            NOT componente IN (''label'', ''etiqueta_titulo'', ''etiqueta_texto_enriquecido'')
    ORDER BY
            respuesta_orden;
    ';

END IF;

END;
$function$
;