2012-03-09 13 views
10

我有這個疑問在DB2是否大於任何日期數據類型?

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A 

如果SYSDATENULL,這將是比任何@A值大,假設@ASOMESCHEMA.SOMETABLE.SYSDATE日期數據類型?

請幫忙。提前致謝。

+3

IF DB2具有「ANSI NULL」語義,那麼唯一的二進制運算符是真實的應該是「 IS NULL「,AFAIK。 – 2012-03-09 06:33:36

+1

@pst DB2 [has ANSI](http://www.dbforums.com/db2/765612-handing-null-values-db2.html#post2808106),你是什麼意思_唯一二元運算符是真實的應該是「一片空白」_ ? – 2012-03-09 06:45:59

回答

8

另一個用於比較可以包含NULL值的值的謂詞是DISTINCT謂詞。如果兩列包含一個相等的非空值,則使用正常相等比較(COL1 = COL2)比較兩列將爲真。如果兩列都爲空,則結果將爲假,因爲null永遠不會等於任何其他值,甚至不會是另一個空值。使用DISTINCT謂詞,空值被認爲是相等的。因此,如果兩列包含相等的非空值並且兩列都爲空值,則COL1不是COLTIN2的DISTINCT將爲真。

DB2 Null Handling

這意味着,所有的比較操作將是錯誤的,因爲你是一個未知的值進行比較的東西。所以無論你使用哪種比較(只有IS NULL/IS NOT NULL操作確實可行!),它將是錯誤的。

如果您想查詢工作,你應該使用類似

SELECT * 
    FROM SOMESCHEMA.SOMETABLE 
WHERE COALESCE(SYSDATE, TIMESTAMP_FORMAT('0001-01-01 23:59:59', 'YYYY-MM-DD HH24:MI:SS')) > @A 
+0

感謝您的回答,但對我來說似乎有些黯淡。它在那裏說:'null永遠不會等於任何其他值',_equal_與_greater than_條件相同嗎?請幫忙。 – 2012-03-09 06:43:29

+0

我編輯了我的答案,以明確如果比較的一端或兩端都包含空值(IS/IS不爲空),則所有比較都會失敗。 – Eggi 2012-03-09 06:49:47

+1

超級超級超級巨型非常感謝您的幫助,但是您的意思是_fail_,因爲在查詢中會出現錯誤? – 2012-03-09 06:53:25

7

另一種可能性是使用IS NULL測試如果值爲null:

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A OR SYSDATE IS NULL 

將包括值的返回值集合,而不是COALESCE函數。它只適用於簡單的情況。

0

您可以使用此解決方案有兩個可空日期(P.EndDate,C.EndDate)的比較:

[MinDate] = 
     CASE 
      WHEN 
       ISNULL(C.EndDate,P.EndDate) <= ISNULL(P.EndDate,C.EndDate) 
      THEN 
       ISNULL(C.EndDate,P.EndDate) 
      ELSE 
       ISNULL(P.EndDate,C.EndDate) 
     END 
相關問題