postgres: использование CASE и ANY () в предложении WHERE - PullRequest
12 голосов
/ 18 февраля 2011

Есть ли какой-нибудь способ заставить эту работу?

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, потому что мне нужно сопоставить массив.Это выполнимо?

Ответы [ 2 ]

12 голосов
/ 18 февраля 2011

Используйте AND / OR. Что-то вроде:

  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)

Редактировать: отформатированный

6 голосов
/ 23 декабря 2012

Вы должны изменить место ЛЮБОГО:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...