Quiero decidir si ocultar algunos de los campos según el valor del campo:
CREATE FUNCTION hide(messages) RETURNS messages AS $$ SELECT CASE WHEN $1.is_public THEN $1 -- modify only if "is_public" is false ELSE ROW ( $1.id, $1.name, -- some other E'\\x00000000', -- hide this '', -- hide this '[]', -- hide this $1.created, $1.modified, )::messages END AS result; $$ LANGUAGE SQL;Funciona, pero la mantenibilidad es pobre. Cada vez que cambio la tabla de mensajes tengo que cambiar esta función al mismo tiempo.
¿Hay una mejor manera?
Supongo que su problema es tener que seguir agregando campos públicos a la función si se agregan a los messages . Es posible que tenga un poco más de flexibilidad a costa de algo de velocidad con
CREATE FUNCTION hide(messages) RETURNS messages AS $$ DECLARE retval messages; BEGIN IF $1.is_public THEN retval = $1; -- copy SELECT 0, '', '[]' INTO retval.private_field1, retval.private_field2, retval.private_field3; RETURN retval; ELSE RETURN $1; END IF; END $$ LANGUAGE PLPGSQL;