2011-02-18 23 views
11

¿Hay alguna manera de hacer esto?postgres: uso de CASE y ANY() en la cláusula WHERE

SELECT 
* 
FROM table t 
INNER JOIN othertable t2 USING (tid) 
WHERE 
t.tid = 
CASE 
    WHEN t2.someboolval THEN ANY(ARRAY[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]) 
    ELSE ANY(ARRAY[77,66]) 
END 

Desafortunadamente no puedo hacer t.tid = CASE WHEN t2.someboolval THEN 1 ELSE 2 END porque necesito a contrastar una matriz. ¿Es esto factible?

Respuesta

11

Utilice AND/OR. Algo así como:

SELECT 
    * 
    FROM table t 
    INNER JOIN othertable t2 USING (tid) 
    WHERE 
    t2.someboolval AND t.tid IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) 
    OR NOT (t2.someboolval) and t.id IN (77,66) 

Edición: formato

+0

que es perfecto! ¡gracias! – kabiev

6

Tienes que cambiar el lugar de cualquier:

SELECT 
* 
FROM table t 
INNER JOIN othertable t2 USING (tid) 
WHERE 
    t.tid = 
    ANY(CASE 
    WHEN t2.someboolval THEN ARRAY[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 
    ELSE ARRAY[77,66] 
    END) 
Cuestiones relacionadas