You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SQL查询的CASE语句末尾需添加IS NOT NULL?

关于CASE语句末尾END IS NOT NULL的疑惑解答

先假设你遇到的原查询大概是这样的:

SELECT *
FROM matches
WHERE CASE 
         WHEN home_team = '博洛尼亚' AND home_score > away_score THEN 1
         WHEN away_team = '博洛尼亚' AND away_score > home_score THEN 1
      END IS NOT NULL;

为什么要写END IS NOT NULL?

SQL里的CASE语句,如果没有匹配到任何WHEN条件,会默认返回NULL。这里的逻辑是:当博洛尼亚作为主队或客队获胜时,CASE返回1;其他情况(博洛尼亚输了、打平,或者比赛里根本没博洛尼亚)返回NULL。

WHERE子句会过滤掉条件为假或NULL的行,所以CASE ... END IS NOT NULL其实就是筛选出所有CASE返回非NULL的行——也就是博洛尼亚获胜的那些比赛。

你的两个疑问解释

  1. 为什么不用AND IS NOT NULL?
    这里的CASE语句是作为一个整体参与WHERE条件判断的,END IS NOT NULL是对CASE的返回值做判断,不是和其他条件用AND连接。如果写成CASE ... END AND IS NOT NULL,语法上就错了,因为IS NOT NULL需要跟在一个值后面,不能单独用AND连接。

  2. 能不能去掉IS NOT NULL?
    其实可以。因为在WHERE子句中,NULL会被视为不满足条件,直接写CASE ... END的效果和CASE ... END IS NOT NULL是一样的——只有当CASE返回1(非NULL)时,条件才为真。有些人习惯显式写IS NOT NULL,是为了让逻辑更清晰,避免其他人误解CASE的返回值逻辑。

更简洁的替代写法

其实这种场景完全不需要用CASE,直接用OR组合条件可读性更高:

SELECT *
FROM matches
WHERE (home_team = '博洛尼亚' AND home_score > away_score)
   OR (away_team = '博洛尼亚' AND away_score > home_score);

内容的提问来源于stack exchange,提问作者Eve Spencer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:33:10