如何在CASE WHEN语句的WHERE子句中实现'is null'判断?无需PL/SQL可行吗?
关于CASE WHEN在WHERE子句中处理NULL判断的问题解答
嘿,我来帮你搞定这两个SQL场景下的问题,纯SQL就能解决,不用搞复杂的PL/SQL~
问题1:如何在CASE WHEN语句的WHERE子句中实现'is null'判断?
首先得明确一个关键点:SQL里的CASE是标量表达式,它只能返回具体的值(比如数字、字符串),不能直接返回布尔条件(像t.something IS NULL这种判断式)。所以直接写WHERE CASE WHEN ... THEN t.something IS NULL END会报错,因为数据库不知道怎么把这个布尔判断当成筛选条件。
那正确的实现方式有两种,推荐用第一种更简洁的逻辑组合写法:
方案1:用逻辑运算符直接组合条件(推荐)
比如你的需求是:当status等于'A'时,筛选t.id为NULL的行;否则筛选t.id不为NULL的行。可以这么写:
SELECT * FROM your_table t WHERE (t.status = 'A' AND t.id IS NULL) OR (t.status != 'A' AND t.id IS NOT NULL);
方案2:用CASE返回数值模拟布尔判断
如果非要用CASE,可以让它返回1或0,再判断是否等于1:
SELECT * FROM your_table t WHERE CASE WHEN t.status = 'A' THEN CASE WHEN t.id IS NULL THEN 1 ELSE 0 END ELSE CASE WHEN t.id IS NOT NULL THEN 1 ELSE 0 END END = 1;
不过这种写法可读性差很多,除非有特殊需求,不然优先选方案1。
问题2:参数控制筛选NULL数据,无需PL/SQL实现
当然可以不用PL/SQL!你现有语句的问题和上面一样:CASE不能直接返回布尔判断。我们只需要用逻辑条件组合就能实现需求:当参数$foo$等于'yes'时,只筛选t.something为NULL的行;当参数是其他值时,返回所有行(或者保留你原本的其他筛选条件)。
正确写法示例
SELECT * FROM table t WHERE ($foo$ = 'yes' AND t.something IS NULL) OR ($foo$ != 'yes'); -- 当参数不是'yes'时,不额外限制,返回所有行
如果参数可能为空(比如下拉框没选值),可以加上参数为空的处理:
SELECT * FROM table t WHERE ($foo$ = 'yes' AND t.something IS NULL) OR ($foo$ IS NULL OR $foo$ != 'yes');
要是当参数不是'yes'时,你还有其他筛选条件,直接把$foo$ != 'yes'换成对应的条件就行,比如:
SELECT * FROM table t WHERE ($foo$ = 'yes' AND t.something IS NULL) OR ($foo$ != 'yes' AND t.some_other_col = 'bar');
同样,也可以用CASE模拟,但还是逻辑组合更直观好维护。
内容的提问来源于stack exchange,提问作者Some One
相关产品推荐
相关产品推荐

