2012-03-09 28 views
10

Tôi có truy vấn này trong DB2Null có lớn hơn bất kỳ loại dữ liệu ngày nào không?

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A 

Nếu SYSDATENULL, nó sẽ lớn hơn bất kỳ giá trị của @A, giả định rằng @ASOMESCHEMA.SOMETABLE.SYSDATE là một Ngày loại dữ liệu?

Vui lòng trợ giúp. Cảm ơn trước.

+3

NẾU DB2 có "ANSI NULL" ngữ nghĩa thì chỉ có các nhà điều hành nhị phân đó là sự thật nên " IS NULL ", AFAIK. –

+1

@pst DB2 [có ANSI] (http://www.dbforums.com/db2/765612-handing-null-values-db2.html#post2808106), ý của bạn là gì bởi _the toán tử nhị phân duy nhất đúng là "IS NULL" _? –

Trả lời

8

Một biến vị ngữ hữu ích để so sánh các giá trị có thể chứa giá trị NULL là vị từ DISTINCT. So sánh hai cột bằng cách sử dụng so sánh bình đẳng (COL1 = COL2) sẽ đúng nếu cả hai cột chứa giá trị không null bằng nhau. Nếu cả hai cột là null, kết quả sẽ là false bởi vì null không bao giờ bằng bất kỳ giá trị nào khác, thậm chí không phải là một giá trị null khác. Sử dụng vị từ DISTINCT, các giá trị null được coi là bằng nhau. Vì vậy, COL1 KHÔNG PHÂN TÍCH từ COL2 sẽ là true nếu cả hai cột chứa giá trị không null bằng nhau và cũng có thể khi cả hai cột là giá trị null.

DB2 Null Handling

Điều đó có nghĩa rằng tất cả các hoạt động so sánh sẽ là sai lầm bởi vì bạn đang so sánh một giá trị không biết đến một cái gì đó. Vì vậy, không có vấn đề mà so sánh bạn sử dụng (chỉ có IS NULL/IS NOT NULL hoạt động làm việc!), Nó sẽ là sai.

Nếu bạn muốn truy vấn để làm việc bạn nên sử dụng một cái gì đó giống như

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

Cảm ơn bạn đã trả lời, nhưng có vẻ hơi mờ nhạt với tôi. Nó nói ở đó: 'null không bao giờ bằng bất kỳ giá trị nào khác', là _equal_ có giống với _greater than_ condition không? Hãy giúp tôi. –

+0

Tôi đã chỉnh sửa câu trả lời của mình để làm rõ rằng tất cả các so sánh đều thất bại nếu một hoặc cả hai bên của so sánh không có (ngoại trừ IS/IS NOT NULL). – Eggi

+1

Siêu duper siêu mega cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn, nhưng những gì bạn có nghĩa là bởi _fail_, như trong truy vấn sẽ ném một lỗi? –

7

Một khả năng khác là sử dụng IS NULL để kiểm tra xem một giá trị là null:

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

sẽ bao gồm các giá trị trong bạn thiết lập các giá trị trả về, thay vì hàm COALESCE. Nó chỉ hoạt động với các trường hợp đơn giản.

0

Bạn có thể sử dụng giải pháp này để so sánh hai ngày nullable (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 
Các vấn đề liên quan