2012-12-28 33 views
1

在SQL我試圖檢查以下條件SQL是條件的快捷方式?

WHERE (col1 is null and col2 is not null) or (col1 is not null and col2 is null) 

還有什麼能讓這種情況下更短的邏輯呢?

的什麼,我試圖做

說明我有2個表每個表有3列

Table1(Ft) Table2(Dt) 
ID   ID 
F1   D1 
F2   D2 
F3   D3 

在F列是整數類型d列是時間類型

F1 correspondes to D1 
F2 correspondes to D2 
F3 correspondes to D3 

我想選擇其中F爲空且D填充或D爲空且F填充的行 以下是完整代碼,使其更短!

SELECT f1, 
     f2, 
     f3, 
     d1, 
     d2, 
     d3 
FROM ftable Ft 
     INNER JOIN dtable Dt 
       ON Ft.ID= Dt.ID 
WHERE (((d1 IS NULL 
      AND f1 IS NOT NULL) 
      OR (d1 IS NOT NULL 
       AND f1 IS NULL)) 
      OR ((d2 IS NULL 
       AND f2 IS NOT NULL) 
       OR (d2 IS NOT NULL 
        AND f2 IS NULL)) 
      OR ((d2 IS NULL 
       AND f2 IS NOT NULL) 
       OR (d3 IS NOT NULL 
        AND f3 IS NULL))) 
+2

我不知道有什麼方法可以縮短它 - 有與沒有關聯的實際成本謂詞的長度。這兩個發佈的答案(迄今爲止)都有不同程度的缺陷,並且可能會掩蓋他們的意圖(如果他們確實工作的話)。寫明確的代碼,您(或其他人)可以在6個月的時間內清楚地閱讀和理解。 –

+0

@Damien_The_Unbeliever剛剛做到了! – user1570048

回答

2

您可以嘗試

WHERE (ISNULL(col1) != ISNULL(col2)) 

哦,那是爲MySQL。對於SQL Server,你可以試試這個:

WHERE (NULLIF(col1, col2) IS NOT NULL) 
+4

第二個條件並不排除兩個列都是非NULL。 –

2

由於col1 IS NULLcolx IS NOT NULL是互斥的(不能同時在同一時間),並窮盡(必須是其中之一),你可以使用XOR運算。我不知道很多有關SQL Server的,但我認爲它使用^操作:

WHERE col1 IS NULL^col2 IS NULL 

這基本上說「COL1爲空,或者COL2爲空,但不能同時」。

參考:

http://msdn.microsoft.com/en-us/library/ms190277.aspx

+1

這是一個按位運算符,並且需要整體類型 - 不是這裏 –

+0

已經尋找XOR運算符,事實證明它們僅用於位 – user1570048

1

如果任何column的是not null則u想要顯示結果。因此,短query將是:

select * from Table_Name WHERE col1 IS not NULL OR col2 IS not NULL 

,如果列的類型位則:

select * from Table_Name WHERE col1^col2