SQL查询中Deselect功能失效,请求排查原因
解决SQL查询中Deselect功能失效的问题
嘿,我来帮你捋捋这个Deselect功能不好使的问题~首先我猜你说的Deselect是指排除包含'2459'的ApprovedBy记录对吧?从你给出的两个查询来看,当前逻辑是在筛选包含'2459'的记录,要实现反向排除的话,得调整WHERE条件,还要注意一个容易踩坑的NULL值问题,这大概率是你觉得功能失效的原因。
问题分析
你当前的查询用了WHERE ApprovedBy LIKE '%2459%',这是在找包含'2459'的记录。如果想实现Deselect(排除这些记录),直接换成NOT LIKE还不够——因为COALESCE如果所有AppByENo字段都是NULL的话,ApprovedBy会返回NULL,而SQL里NULL和任何值做比较结果都是UNKNOWN,不会被NOT LIKE的条件选中,这就会导致那些没有任何审批人的记录被漏掉,看起来像是功能失效了。
修正后的查询示例
第一个查询的修正版
select top 20 * from ( Select Rec_Num, COALESCE(AppByENo6,AppByENo5,AppByENo4,AppByENo3,AppByENo2,AppByENo1) as ApprovedBy FROM FO_Entry INNER JOIN Employees ON FO_Entry.Hq_Code = Employees.E_HQCode ) as abc where ApprovedBy NOT LIKE '%2459%' OR ApprovedBy IS NULL; -- 加上这个条件,确保无审批人的记录也被保留(如果需要的话)
第二个查询的修正版(补全并调整逻辑)
select top 10 * from ( Select Rec_Num, COALESCE(AppByENo6,AppByENo5,AppByENo4,AppByENo3,AppByENo2,AppByENo1) as ApprovedBy FROM FO_Entry INNER JOIN Employees ON FO_Entry.Hq_Code = Employees.E_HQCode ) as abc where ApprovedBy NOT LIKE '%2459%' OR ApprovedBy IS NULL;
几个关键注意点
- 逻辑调整:用
NOT LIKE '%2459%'替代LIKE,实现排除(Deselect)的核心逻辑 - 处理NULL值:必须加上
OR ApprovedBy IS NULL,否则那些所有审批字段都是NULL的记录会被过滤掉,导致结果不符合预期 - 列别名规范:你之前给ApprovedBy加了单引号
'ApprovedBy',这在部分数据库里虽然能运行,但单引号是用来表示字符串常量的,标准写法应该用方括号[ApprovedBy]或者直接写ApprovedBy(因为别名没有空格),避免歧义。
内容的提问来源于stack exchange,提问作者Sixthsense
相关产品推荐
相关产品推荐

