在WHERE子句中使用AND和OR条件获取错误的结果

Jon*_*han -1 sql t-sql sql-server

我有这样一张桌子:

+-------------+--------------------------------------+--------------------------------------+---------------+
| BackCheckId |                TaskId                |               EmpGuid                | CompletedDate |
+-------------+--------------------------------------+--------------------------------------+---------------+
|           1 | B92F7079-2011-44D6-B3C4-BD2F7481C97F | 6074CAEA-7A8E-4699-9451-16C2EAF394EF | NULL          |
|           2 | 82AB0C4B-9342-46FA-ACBE-C00B87571BF9 | 6074CAEA-7A8E-4699-9451-16C2EAF394EF | NULL          |
+-------------+--------------------------------------+--------------------------------------+---------------+
Run Code Online (Sandbox Code Playgroud)

查询创建:

CREATE TABLE Backchecks(
  BackCheckId int,
  TaskId UNIQUEIDENTIFIER,
  EmpGuid UNIQUEIDENTIFIER,
  CompletedDate DATETIME
);

INSERT INTO Backchecks VALUES
(1, 'B92F7079-2011-44D6-B3C4-BD2F7481C97F', '6074CAEA-7A8E-4699-9451-16C2EAF394EF',NULL),
(2, '82AB0C4B-9342-46FA-ACBE-C00B87571BF9','6074CAEA-7A8E-4699-9451-16C2EAF394EF',NULL)
Run Code Online (Sandbox Code Playgroud)

我想要做的是根据这个过滤这些数据currentEmpGuid我声明变量来测试它:

 DECLARE @CurrentEmpGuid UNIQUEIDENTIFIER = 'CC713AC9-ED79-47E3-BA37-47F2D5009BFC'   
DECLARE @FilterEmpKey INT = NULL
    SELECT * FROM Backchecks AS BC 
    WHERE [BC].[CompletedDate] IS NULL
                           AND (@FilterEmpKey IS NULL
                            OR [BC].[EmpGuid] = @CurrentEmpGuid)
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它不应该返回任何结果,因为BC.EmpGuid它不等于表中的任何结果,但由于某种原因我得到了结果.我究竟做错了什么?

Dav*_*oft 5

BC.EmpGuid不等于表中的任何结果,但由于某种原因我得到了结果.我究竟做错了什么?

 WHERE [BC].[CompletedDate] IS NULL
Run Code Online (Sandbox Code Playgroud)

这两行都是正确的

(@FilterEmpKey IS NULL
      OR [BC].[EmpGuid] = @CurrentEmpGuid)
Run Code Online (Sandbox Code Playgroud)

因为@FilterEmpKey为NULL,所有行也为TRUE.[BC].[EmpGuid] = @CurrentEmpGuid如果将@FilterEmpKey设置为某个非空值,则只需要进行评估.