SQL Server where子句,带有空列

时间:2015-02-15 11:33:31

标签: sql sql-server sql-server-2008

我有一个Employee表,它的工作原理是,当添加新员工时,列[DOR]将为空,[Status]将为1.当员工正在从公司解除后,[DOR]列值将是他/她离开公司的日期,[Status]设置为0。

我需要获取在给定日期可用的所有员工的详细信息。必须提取Status为1的员工以及直到该日期尚未解除的员工。

但我无法像在等同DOR时那样做,它的空值并没有返回任何行。

Data in Employee table

如果我将输入设为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)))

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

这样的东西?

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

答案 2 :(得分:0)

试试这个:

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

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

答案 3 :(得分:0)

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

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