postgres:在 WHERE 子句中使用 CASE 和 ANY()

Posted

技术标签:

【中文标题】postgres:在 WHERE 子句中使用 CASE 和 ANY()【英文标题】:postgres: use of CASE and ANY() in WHERE clause 【发布时间】:2011-06-30 00:51:06 【问题描述】:

有什么办法可以做到吗?

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,因为我需要匹配一个数组。这可行吗?

【问题讨论】:

【参考方案1】:

使用 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)

编辑:格式化

【讨论】:

【参考方案2】:

您必须更改 ANY 的位置:

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)

【讨论】:

以上是关于postgres:在 WHERE 子句中使用 CASE 和 ANY()的主要内容,如果未能解决你的问题,请参考以下文章

SQL / Postgres join where子句

Postgresql 包含在 where 子句中

无法在 Kotlin/Java 中使用 jooq DSL 执行 where 子句

Postgres_FDW 没有推低 WHERE 标准

PostgreSQL 函数不适用于 WHERE 子句

与查询具有相同 WHERE 子句的子查询