如何在SQL Server中根据列值筛选行?附示例需求
动态筛选SQL Server行的解决方案
嘿,我来帮你搞定这个条件筛选的需求!根据你描述的逻辑——如果数据集里存在checkid=1且value=0的行,就只显示checkid=2的记录;如果不存在这类行,就显示checkid=1的记录,我给你整理了两种可行的SQL写法,都能实现目标。
方法一:用CASE语句简化逻辑
这种写法可读性更强,一眼就能理清逻辑分支:
WITH allData AS ( SELECT mlid=1, value=0, checkid=1 UNION ALL SELECT mlid=2, value=6, checkid=2 UNION ALL SELECT mlid=3, value=6, checkid=1 UNION ALL SELECT mlid=4, value=0, checkid=2 ) SELECT * FROM allData WHERE CASE -- 先判断是否存在触发条件的行 WHEN EXISTS(SELECT 1 FROM allData WHERE checkid=1 AND value=0) THEN checkid=2 -- 存在则只取checkid=2的记录 ELSE checkid=1 -- 不存在则取checkid=1的记录 END
方法二:用逻辑运算符直接组合条件
如果你更喜欢直白的逻辑组合,也可以这么写,和上面的效果完全一致:
WITH allData AS ( SELECT mlid=1, value=0, checkid=1 UNION ALL SELECT mlid=2, value=6, checkid=2 UNION ALL SELECT mlid=3, value=6, checkid=1 UNION ALL SELECT mlid=4, value=0, checkid=2 ) SELECT * FROM allData WHERE -- 存在目标行时,筛选checkid=2 (EXISTS(SELECT 1 FROM allData WHERE checkid=1 AND value=0) AND checkid=2) OR -- 不存在目标行时,筛选checkid=1 (NOT EXISTS(SELECT 1 FROM allData WHERE checkid=1 AND value=0) AND checkid=1)
结果验证
针对你给出的示例数据,因为确实存在mlid=1(checkid=1、value=0)的记录,所以查询会返回所有checkid=2的行:
mlid | value | checkid -----|-------|-------- 2 | 6 | 2 4 | 0 | 2
(注:你给出的期望结果里包含了mlid=3(checkid=1)的记录,这和你描述的筛选条件不符,可能是笔误哦~)
内容的提问来源于stack exchange,提问作者lalit sharma
相关产品推荐
相关产品推荐

