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)
我有一个 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)