Re: Consulta con CASE!!!

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Lazaro Ruben Garcia Martinez <lgarciam(at)estudiantes(dot)uci(dot)cu>
Cc: postgre(dot)es <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consulta con CASE!!!
Date: 2011-02-24 23:13:51
Message-ID: 1298588755-sup-3871@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 <alvherre(at)alvh(dot)no-ip(dot)org>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Lazaro Ruben Garcia Martinez 2011-02-25 03:00:54 Re: coincidencias en postgres?
Previous Message Daniel Juárez 2011-02-24 22:44:24 coincidencias en postgres?