[英]CASE...WHEN in WHERE clause in Postgresql
我的查询看起来像:
SELECT *
FROM table
WHERE t1.id_status_notatka_1 = ANY (selected_type)
AND t1.id_status_notatka_2 = ANY (selected_place)
在这里我想添加 CASE WHEN 所以我的查询是:
SELECT *
FROM table
WHERE t1.id_status_notatka_1 = ANY (selected_type)
AND t1.id_status_notatka_2 = ANY (selected_place)
AND CASE
WHEN t2.id_bank = 12 THEN t1.id_status_notatka_4 = ANY (selected_effect)
END
但它不起作用。 语法很好,但无法搜索任何内容。 所以我的问题是 - 如何在 WHERE 子句中使用 CASE WHEN。 简短示例:如果 a=0 则向 WHERE(AND 条件)添加一些条件,如果不是则不添加(AND 条件)
不需要CASE EXPRESSION
,只需使用OR
和括号:
AND (t2.id_bank <> 12 OR t1.id_status_notatka_4 = ANY (selected_effect))
对于那些希望在 WHERE 子句中使用 CASE 的人,在上面的 case 块中添加else true
条件应该允许查询按预期工作。 在 OP 中,案例将解析为 NULL,这将导致 WHERE 子句有效地选择 WHERE... AND NULL,这将始终失败。
SELECT *
FROM table
WHERE t1.id_status_notatka_1 = ANY (selected_type)
AND t1.id_status_notatka_2 = ANY (selected_place)
AND CASE
WHEN t2.id_bank = 12 THEN t1.id_status_notatka_4 = ANY (selected_effect)
ELSE true
END
接受的答案有效,但我想为那些正在寻找不同答案的人分享意见。 感谢 sagi,我提出了以下查询,但我也想提供一个测试用例。
让我们假设这是我们表的结构
tbl
id | type | status
-----------------------
1 | Student | t
2 | Employee | f
3 | Employee | t
4 | Student | f
我们想要选择所有学生行,状态 = 't',但是,我们也想检索所有员工行,而不管其状态如何。
如果我们执行SELECT * FROM tbl WHERE type = 'Student' AND status = 't'
我们只会得到以下结果,我们将无法获取员工
tbl
id | type | status
-----------------------
1 | Student | t
并执行SELECT * FROM tbl WHERE Status = 't'
我们只会得到以下结果,我们在结果上得到了一个 Employee Row 但结果集中没有包含 Employee Rows,有人可能会争辩说执行IN
可能有效,然而,它会给出相同的结果集。 SELECT * FROM tbl WHERE type IN('Student', 'Employee') AND status = 't'
tbl
id | type | status
-----------------------
1 | Student | t
3 | Employee | t
记住,我们想要检索所有 Employee 行,而不管其状态如何,为此我们执行查询
SELECT * FROM tbl WHERE (type = 'Student' AND status = 't') OR (type = 'Employee')
结果将是
table
id | type | status
-----------------------
1 | Student | t
2 | Employee | f
3 | Employee | t
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.