SQL WHERE筛选活跃项目时仅部分行生效的问题咨询
问题原因
SQL 中 AND 运算符的优先级高于 OR,你当前编写的 WHERE 条件实际执行逻辑等价于:
(ActiveAsString = '0' AND ID 匹配筛选关键词) OR PartNumber 匹配筛选关键词 OR CustomerName 匹配筛选关键词
只要 PartNumber 或者 CustomerName 符合筛选规则,无论 ActiveAsString 字段值是否为 0,对应的记录都会被返回,这就是你遇到的部分数据不受活跃状态过滤约束的原因。
解决方案
将所有关键词匹配的条件用括号包裹为一个逻辑组,再和活跃状态的过滤条件做 AND 关联即可,修正后的 SQL 如下:
SELECT dbo_tblTrialTest.ID, dbo_tblTrialTest.PartNumber, dbo_tblTrialTest.CreationDate, dbo_tblTrialTest.Init, dbo_tblTrialTest.CompletionInit, dbo_tblTrialTest.CustomerName, dbo_tblTrialTest.CompletionDate, dbo_tblTrialTest.Description, dbo_tblTrialTest.ActiveAsString FROM dbo_tblTrialTest WHERE dbo_tblTrialTest.ActiveAsString = TRIM("0") AND ( dbo_tblTrialTest.ID LIKE '*' & [Forms]![frmTrialTestOverview]![tfFilter] & '*' OR dbo_tblTrialTest.PartNumber LIKE '*' & [Forms]![frmTrialTestOverview]![tfFilter] & '*' OR dbo_tblTrialTest.CustomerName LIKE '*' & [Forms]![frmTrialTestOverview]![tfFilter] & '*' );
可选优化
如果 ActiveAsString 字段存在空格、空值等异常存储情况,可以调整过滤条件规避异常:
WHERE TRIM(Nz(dbo_tblTrialTest.ActiveAsString, '1')) = '0'
Nz 函数可以将 NULL 值替换为指定的默认值,这里默认替换为已完成状态的取值'1',避免空值记录被误判为活跃项目。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

