SQL 带有空列的服务器 where 子句

SQL Server where clause with null column

我有一个 Employee table 它的工作原理是,当添加新员工时,列 [DOR] 将为空,而 [Status] 将为 1 . 当员工离职时,[DOR]列值将是he/she离开公司的日期,[Status]设置为0。

我需要获取在给定日期有空的所有员工的详细信息。 Status为1的员工和到那个日期还没有解雇的员工必须被提取。

但我无法像等同于 DOR 时那样做,它的空值不返回任何行。

如果我将输入作为 2015-02-10,它应该获取两条记录,而当我输入 2015-02-15 时,它应该只获取第一条记录。

CREATE TABLE [Employee]
(
    [EmployeeId] [int] IDENTITY(1000,1) NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [RoleId] [int] NOT NULL,
    [Email] [varchar](50) NULL,
    [Contact] [varchar](50) NULL,
    [DOJ] [date] NOT NULL,
    [DOR] [date] NULL,
    [Status] [bit] NOT NULL,
    [Salary] [decimal](18, 2) NULL
)

INSERT [dbo].[Employee] ([EmployeeId], [Name], [RoleId], [Email], [Contact], [DOJ], [DOR], [Status], [Salary])  
VALUES (1001, N'Employee 1', 3, N'', N'', CAST(0x8D390B00 AS Date), NULL, 1, CAST(6000.00 AS Decimal(18, 2)))

INSERT [dbo].[Employee] ([EmployeeId], [Name], [RoleId], [Email], [Contact], [DOJ], [DOR], [Status], [Salary]) 
VALUES (1002, N'Employee 2', 7, N'', N'', CAST(0x8D390B00 AS Date), CAST(0x9A390B00 AS Date), 0, CAST(4000.00 AS Decimal(18, 2)))

是这样的吗?

select
    EmployeeId,
    Name
from 
    Employee 
where
    DOJ <= @searchDate and 
    (DOR is null or DOR > @searchDate)

试试这个:

SELECT * FROM Employee
WHERE @dateOfSearch BETWEEN DOJ and COALESCE(DOR, '2099-12-31')

这个查询的作用是检查搜索日期是否在开始日期和结束日期之间。如果结束日期为 null,则使用 COALESCE 函数获取非常高的价值日期。

您需要在您的条件下使用 IS NULL 运算符而不是 = NULL,如下所示:

SELECT *
FROM Employee
WHERE DOJ <= '2015-02-15'
  AND (DOR IS NULL OR DOR > '2015-02-15')

先前答案的另一种变体:-)

SELECT * FROM Employee
WHERE @dateOfSearch BETWEEN DOJ and COALESCE(DOR, @dateOfSearch)