[英]SQL Server where clause with null column
我有一個Employee
表,它的工作方式是,添加新雇員時, [DOR]
列將為空, [Status]
將為1。當雇員從公司[DOR]
, [DOR]
列值將是他/她離開公司的日期, [Status]
設置為0。
我需要獲取給定日期可用的所有員工的詳細信息。 必須提取Status
為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)))
在這種情況下,您需要使用IS NULL
運算符而不是= NULL
,如下所示:
SELECT *
FROM Employee
WHERE DOJ <= '2015-02-15'
AND (DOR IS NULL OR DOR > '2015-02-15')
像這樣嗎
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
函數獲取非常高的日期。
先前答案的另一種形式:-)
SELECT * FROM Employee
WHERE @dateOfSearch BETWEEN DOJ and COALESCE(DOR, @dateOfSearch)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.