2012-07-19 35 views
4

我正在做2列2個表的外部聯接。如果table1.column1 = table2.column1和table1.column2 = table2.column2,則會發生連接。由於列2允許包含空值,因此只要值爲空,聯接就會失敗,因爲null不等於null(只有一位計算機科學家可以喜歡)。如何在兩個表都包含NULL時加入

我想出瞭解決方法是:

select table1.column1,table1.colunn1,table2.column1,table2.column2 from 
table1 
left join table2 
     on table1.column1=table2.column1 
     and if(table1.column2 is null,table2.column2 is null, table1.column2=table2.column2) 

這正常工作,但必須有一個更好的辦法?

+1

你不必成爲一名計算機科學家理解爲什麼'NULL = NULL'不能真正導致'TRUE'。只要考慮下面的例子。 *哈姆雷特*的作者是莎士比亞,麥克白*的作者也是莎士比亞。另一方面,Gilgamesh *的Epic的作者是未知的(NULL),所以* Mahabharata *的作者也是如此。現在,我們可以*說*前兩本書,他們的作者是同一個人,但我們不能說那兩部書。 – 2012-07-19 18:42:10

+0

@AndriyM:好點。雖然對於數據庫的使用很明顯,但很多人並沒有真正想到他們的數據 - 因此需要mysql來包含一個無效的比較運算符。我自己的感覺是,應該是默認值,並讓人們明確選擇嚴格的null操作符。 – 2012-07-19 20:07:57

回答

9

你可以使用MySQL null-safe comparison operator<=>

SELECT t1.column1, t1.column2, t2.column1, t2.column2 
FROM  table1 t1 
LEFT JOIN table2 t2 
     ON t1.column1 = t2.column1 AND t1.column2 <=> t2.column2 
+0

不應該只是't1.column2 <=> t2.column2'?一旦你使用這種比較,另一個變得多餘,除非我失去了一些東西(至少經常沒有使用'<=>')。 – 2012-07-19 18:03:08

+1

@AndriyM,OP有兩個不同的列:「column1」和「column2」。 'column2'被允許包含'NULL',但是我們仍然想保留'column1'上的連接條件。 – 2012-07-19 18:06:28

+0

啊,是的,列是不同的,我錯過了。抱歉。 – 2012-07-19 18:07:56

3

我會做LEFT JOIN table2 ON table1.column1 = table2.column1 OR (table1.column1 IS NULL AND table2.column1 IS NULL)。我不確定這是否可行。

(順便說一句,空不是值)。