首页 > 解决方案 > Where 子句以相同的逻辑返回不同的结果

问题描述

我是 sql 新手,我有这样的 where 子句:

第一个查询(生产)

WHERE [D].[IsLocked] = 0
                        AND ((@FilterEmpKey IS NULL
                        AND [TA].[EmpKey] = @CurrentEmpKey)
                         OR (ISNULL([TA].[ModifiedAssignedBy] , [TA].[AssignatedBy]) = @FilterEmpKey
                        AND [TA].[EmpKey] = @CurrentEmpKey))

第二次查询(测试)

WHERE [D].[IsLocked] = 0 
              AND  [TA].EmpKey = @CurrentEmpKey  
              OR (ISNULL([TA].[ModifiedAssignedBy] , [TA].[AssignatedBy]) = @FilterEmpKey
              AND [TA].[EmpKey] = @CurrentEmpKey)

我想知道第一个和第二个查询有什么区别,因为结果不一样,我不知道为什么?问候

注意:我想要的结果是获取测试查询的值

标签: sqlsql-servertsql

解决方案


这是一个例子。当@FilterEmpKey IS NOT NULL 并且@CurrentEmpKey 匹配TA.EmpKey 时,查询返回不同的结果集。

CREATE TABLE TA (EmpKey VARCHAR(25), ModifiedAssignedBy VARCHAR(25), AssignatedBy VARCHAR(25))
INSERT INTO TA VALUES ('test', 'test_mod', 'test_assign')

DECLARE @FilterEmpKey VARCHAR(25) = 'banana'
DECLARE @CurrentEmpKey VARCHAR(25) = 'test'

-- Returns nothing; both conditions are false.
SELECT * FROM TA
WHERE  ((@FilterEmpKey IS NULL
                        AND [TA].[EmpKey] = @CurrentEmpKey)
                         OR (ISNULL([TA].[ModifiedAssignedBy] , [TA].[AssignatedBy]) = @FilterEmpKey
                        AND [TA].[EmpKey] = @CurrentEmpKey))

-- Returns a row; first condition is true.
SELECT * FROM TA
WHERE [TA].EmpKey = @CurrentEmpKey  
              OR (ISNULL([TA].[ModifiedAssignedBy] , [TA].[AssignatedBy]) = @FilterEmpKey
              AND [TA].[EmpKey] = @CurrentEmpKey)

推荐阅读