2011-02-10 148 views
2

與此C#語句等效的SQL會是什麼?SQL檢查WHERE子句中的NULL(三元運算符?)

bool isInPast = (x != null ? x < DateTime.Now() : true)

我需要構建一個WHERE條款,將檢查x < NOW()只有x IS NOT NULLxdatetime,有時需要爲空,而其他時間不爲空,我只希望WHERE子句考慮非空值,並將空值視爲true。

眼下條款是:

dbo.assignments.[end] < { fn NOW() }

這對於非NULL的情況下工作,但NULL值似乎總是使表達式計算結果爲假。我想:

dbo.assignments.[end] IS NOT NULL AND dbo.assignments.[end] < { fn NOW() }

這似乎沒有任何效果。

+0

沒關係,這是我的數據問題。 – cmv 2011-02-10 05:47:46

回答

0

你正在尋找的一個可能是CASE聲明

0

你需要像

WHERE X IS NULL 
OR X < NOW() 
+0

我認爲你的意思是`GetDate()`而不是`Now()`用於SQL Server。 – Thomas 2011-02-10 05:49:06

0

有兩個單獨的查詢,一個當X是空一個不是時候。試圖混合兩個不同的條件是確保獲得一個糟糕的計劃的方法。請記住,生成的計劃必須適用於所有 x的值,因此基於它的任何優化(索引範圍掃描)都不再可能。

5

對於WHERE子句中使用,你必須單獨測試

where dbo.assignments.[end] is null or dbo.assignments.[end] < GetDate() 

,或者你可以把空爲日期(這將永遠是真實的)

where isnull(dbo.assignments.[end],0) < GetDate() 

,或者你可以做針對來自來源的比特標記的陰性測試下面

where case when dbo.assignments.[end] < GetDate() then 0 else 1 end = 1 


以下是解釋以及如何爲SELECT子句派生isInPast。

布爾isInPast =(!?X = NULL X < DateTime.Now():真)

一個布爾值,只能有兩種結果之一,是真是假。
在您的標準仔細地觀察,假的唯一的條件是,當

X!= NULL & & X <現在

鑑於這一事實,它成爲一個簡單的翻譯,因爲在SQL,x < now只能當x!=null,需要這樣只有一個條件評估

isInPast = case when dbo.assignments.[end] < { fn NOW() } then 0 else 1 end 

(1爲true且0爲false)

不確定{ fn NOW() }代表什麼,但是如果希望SQL Server提供當前時間,使用GETDATE()或者如果您使用的是UTC數據,請使用GETUTCDATE()

isInPast = case when dbo.assignments.[end] < GetDate() then 0 else 1 end