SQL Server where子句具有空列

SQL Server where子句具有空列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个Employee表,它的工作原理是,当添加新员工时,[DOR]列将为空,[Status]列将为1。当员工被解除公司职务时,[DOR]列值将是他/她离开公司的日期,[Status]设置为0 我需要获取给定日期内所有可用员工的详细信息。必须将状态为1的员工以及在该日期之前尚未解除职务的员工带走 但我不能像与DOR相等时那样,将其值设为null,并且不返回任何行 如果我以2015-02-10的形式给出输入,它应该获取两条记录,而当我给出2015-02-15时,它应该只获取第一条记录 CREA

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

我需要获取给定日期内所有可用员工的详细信息。必须将
状态为1的员工以及在该日期之前尚未解除职务的员工带走

但我不能像与
DOR
相等时那样,将其值设为null,并且不返回任何行

如果我以
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)
选择
雇员ID,
名称
从…起
雇员
哪里
DOJ@searchDate)
像这样的东西

select
    EmployeeId,
    Name
from 
    Employee 
where
    DOJ <= @searchDate and 
    (DOR is null or DOR > @searchDate)
选择
雇员ID,
名称
从…起
雇员
哪里
DOJ@searchDate)
试试这个:

SELECT * FROM Employee
WHERE @dateOfSearch BETWEEN DOJ and COALESCE(DOR, '2099-12-31')
这个查询的作用是检查搜索日期是否在开始日期和结束日期之间。如果结束日期为
null
,则使用
COALESCE
函数获取非常高的值日期。

尝试以下操作:

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')
选择*
来自员工
其中美国司法部“2015-02-15”)

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

SELECT *
FROM Employee
WHERE DOJ <= '2015-02-15'
  AND (DOR IS NULL OR DOR > '2015-02-15')
选择*
来自员工
其中美国司法部“2015-02-15”)

前面答案的另一个变体:-)


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


哦,非常感谢,伙计!在过去的两个小时里,我一直在为这个挠头。哦,非常感谢,伙计!在过去的两个小时里,我一直在为这个挠头。