2011-02-18 28 views
11

有什麼方法可以使這項工作成爲可能嗎?postgres:在WHERE子句中使用CASE和ANY()

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 

可惜我不能只是做t.tid = CASE WHEN t2.someboolval THEN 1 ELSE 2 END因爲我需要來匹配的數組。這是可行的嗎?

回答

11

使用和/或。喜歡的東西:

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) 

編輯:格式化

+0

這是完美的!謝謝! – kabiev 2017-02-04 12:18:55

6

你必須改變地方的任何:

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)