繁体   English   中英

CASE...WHEN 在 WHERE 子句中 Postgresql

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM