如何通过SQL查询根据Status字段值设置布尔变量?
实现需求的SQL方案
当然可以在查询里直接实现这个布尔变量的逻辑,以下是几种实用的写法:
方法一:用EXISTS判断是否存在Cancel
这种写法逻辑最直观,直接检查目标范围内有没有Cancel记录:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM tablename WHERE Id = 77 AND ThreadId IN (30, 40, 50, 60, 69, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 231, 232, 233, 234, 240, 241, 242, 243, 244, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400) AND Status = 'Cancel' ) THEN FALSE ELSE TRUE END AS IsAllAccepted
方法二:用聚合函数MAX判断
因为Status只有Cancel和Accept两种值,字符串比较中Cancel比Accept大(首字母C的ASCII码高于A),所以可以通过MAX函数快速判断:
SELECT CASE WHEN MAX(Status) = 'Accept' THEN TRUE ELSE FALSE END AS IsAllAccepted FROM tablename WHERE Id = 77 AND ThreadId IN (30, 40, 50, 60, 69, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 231, 232, 233, 234, 240, 241, 242, 243, 244, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400)
逻辑说明:如果所有Status都是Accept,MAX的结果就是Accept,返回true;只要有一个Cancel,MAX结果就是Cancel,返回false。
方法三:用计数对比验证
统计总记录数和Accept记录数,两者相等就说明没有Cancel:
SELECT CASE WHEN COUNT(*) = COUNT(CASE WHEN Status = 'Accept' THEN 1 END) THEN TRUE ELSE FALSE END AS IsAllAccepted FROM tablename WHERE Id = 77 AND ThreadId IN (30, 40, 50, 60, 69, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 231, 232, 233, 234, 240, 241, 242, 243, 244, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400)
逻辑说明:COUNT(CASE WHEN Status='Accept' THEN 1 END)只会统计Status为Accept的记录,和总记录数COUNT(*)相等,就代表所有记录都是Accept。
内容的提问来源于stack exchange,提问作者Sami In
相关产品推荐
相关产品推荐

