簡體   English   中英

SQL Server帶有空列的where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM