SQL WHERE子句多CASE条件问题:非指定AGE无数据返回
解决SQL条件约束的逻辑问题
你的问题出在CASE语句的逻辑上:当AGE不等于'18'时,CASE没有指定ELSE分支,会默认返回NULL。而NULL = 1的结果是FALSE,导致整个WHERE条件不成立,所以这部分数据被过滤掉了。
以下两种方案都能解决你的需求:
方案一:用逻辑表达式直接拆分(推荐)
这种写法逻辑更直观,可读性更强:
SELECT COLUMN_NAME FROM TABLE WHERE NAME_COLUMN = 'NAME' AND ( AGE != '18' OR (ADULTHOOLD_COLUMN = 1 AND ADULTHOOLD_COLUMN_1 = 1) )
逻辑说明:
- 当
AGE不等于'18'时,只需要满足NAME_COLUMN = 'NAME'即可返回数据 - 当
AGE等于'18'时,必须同时满足ADULTHOOLD_COLUMN = 1和ADULTHOOLD_COLUMN_1 = 1
方案二:修改CASE语句添加ELSE分支
给CASE加上ELSE 1,让非18岁的行在这两个条件上自动满足:
SELECT COLUMN_NAME FROM TABLE WHERE NAME_COLUMN = 'NAME' AND CASE WHEN AGE = '18' THEN ADULTHOOLD_COLUMN ELSE 1 END = 1 AND CASE WHEN AGE = '18' THEN ADULTHOOLD_COLUMN_1 ELSE 1 END = 1
逻辑说明:
- 当
AGE等于'18'时,用ADULTHOOLD_COLUMN和ADULTHOOLD_COLUMN_1的值参与判断 - 当
AGE不等于'18'时,CASE返回1,和后面的=1条件匹配,不会过滤掉这些行
内容的提问来源于stack exchange,提问作者Rayner Pangan
相关产品推荐
相关产品推荐

