2013-07-05 24 views
0

如何在查詢中查找未使用'is null'的日期列爲空的行?不使用'isnull'並查找特定列中空值爲零的行

SELECT * FROM HR_OPERATING_UNITS WHERE date_to IS NULL; 

在上面的查詢中我想使用一個綁定變量,它可以有null。 因此,預計查詢:

SELECT * FROM HR_OPERATING_UNITS WHERE date_to=:P_TO_DATE; 

但上面的語句不取通過任何行,雖然在結合可變空。

+4

第一:請不要把所有內容都寫在上面 - 它確實很難閱讀,在人們看來它被認爲是** SHOUTING **,而且很粗魯。其次:爲***什麼數據庫系統***是這樣的? SQL只是查詢語言 - 被許多數據庫使用.....是MySQL嗎? Postgres的? IBM DB2?甲骨文? SQL Server?火鳥? Interbase的?完全不同的東西? –

回答

3

的標準方法是分開處理的變量被空:

SELECT * FROM HR_OPERATING_UNITS 
WHERE date_to=:P_TO_DATE 
OR (:P_TO_DATE IS NULL AND date_to IS NULL) 

如果你真的只能有一個參考變量:

SELECT * FROM HR_OPERATING_UNITS 
WHERE COALESCE(date_to, '1900-01-01') = COALESCE(:P_TO_DATE, '1900-01-01') 

採摘,將永遠不會出現在值date_to列作爲虛擬值。

+0

**非常感謝** – user2042156

0

如果該值爲null,則使用日期最小值:

ISNULL(date_to,cast('1753-1-1' as datetime)) = ISNULL(:P_TO_DATE,cast('1753-1-1' as datetime)) 

這是SQL Server,也許有NVL

1

更換ISNULL如果我明白你的問題,你要篩選時或綁定變量是null,或者不是。如果是這樣,請嘗試以下操作:

SELECT * FROM HR_OPERATING_UNITS WHERE (:P_TO_DATE IS NULL AND date_to IS NULL) OR (date_to=:P_TO_DATE); 
1

可以使用coalesce()做到這一點:

SELECT * 
FROM HR_OPERATING_UNITS 
WHERE coalesce(date_to, '2000-01-01') = coalesce(:P_TO_DATE, '2000-01-01') 

這假定'2000-01-01'date_to有效日期值。

如果兩個值都是NULL,則默認日期比較爲true。如果兩者都不是NULL,那麼比較是列的值。如果其中一個是'NULL',那麼比較的結果是默認值爲false。

+0

會在'date_to'上使用'coalesce'使'date_to'上的索引不被使用? – iruvar

+0

@ 1_CR。 。 。在大多數數據庫中,「是」。 「正確的」解決方案是波希米亞人提出的解決方案,但OP明確指出他/她不想使用'is null'。 –

相關問題