Excerpts from Lazaro Ruben Garcia Martinez's message of mié feb 23 19:32:58 -0300 2011: > Hola a todos, existe alguna forma en la que dentro de un bloque case se > puedan retornar varias columnas sin que el resultado de la colsulta forme una > unica columna??
La única forma en que veo que puede hacerse es creando un tipo que tenga las columnas que quieres. Por ej. create table foo (a int, b int, c int, d int); select a, a*2, random() * a * 1000, a^2 from generate_series(1, 100) a; -- creamos el tipo del resultado que nos interesa create type twoints as (a int, b int); La expresión del CASE lleva ROW() en cada brazo, con un cast al tipo recién creado, y a eso le aplicamos ().* para expandir las columnas. select (case when a % 2 = 0 then row(a, b)::twoints else row(a, d)::twoints end).* from foo; La razón del CREATE TYPE es que el ().* necesita conocer el tipo que estás expandiendo para funcionar. Quizás haya otra forma de hacerlo, pero no la conozco. Para evitar que alguien vea ese tipo sin ningún uso dentro de la BD y lo borre creyendo que nada lo usa, te recomiendo crear una vista con la consulta: create view getfoo as select (case when a % 2 = 0 then row(a, b)::twoints else row(a, d)::twoints end).* from foo; Y luego el DROP TYPE dará un error: alvherre=# drop type twoints; ERROR: no se puede eliminar tipo twoints porque otros objetos dependen de él DETALLE: vista getfoo depende de tipo twoints SUGERENCIA: Use DROP ... CASCADE para eliminar además los objetos dependientes. -- Álvaro Herrera <alvhe...@alvh.no-ip.org> - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda