2012-12-11 57 views
1

我有一個包含完全定義的項目的表,並且第二個表具有潛在的模糊/貪婪命令,因爲NULL需要此參數的所有可用值。MySQL:在JOIN語句中使用NULL作爲通配符

items 
+-----------------------+ 
| item_id | color | size | 
|---------+-------+------| 
| 1 | blue | 8 | 
| 2 | red | 6 | 
| 3 | green | 7 | 
| 4 | black | 6 | 
+------------------------+ 

orders 
+-------------------------+ 
| order_id | color | size | 
|----------+-------+------| 
|  1 | red | 6 | 
|  2 | green | 8 | 
|  3 | NULL | 6 | 
|  4 | blue | NULL | 
|  5 | NULL | NULL | 
+-------------------------+ 

是否有一種有效的方式來生成填寫所有訂單所需的項目的完整列表?

+--------------------+ 
| order_id | item_id | 
|----------+---------| 
|  1 | 2 | 
|  3 | 2 | 
|  3 | 4 | 
|  4 | 1 | 
|  5 | 1 | 
|  5 | 2 | 
|  5 | 3 | 
|  5 | 4 | 
+--------------------+ 

在我看來,像一個INNER JOIN應該能夠做到這一點,但這樣的事情顯然沒有考慮NULL值作爲貪婪的通配符在訂單的可能性表:

SELECT order_id, item_id 
FROM orders 
INNER JOIN items ON orders.color = items.color AND orders.size = items.size 

有沒有想法?

回答

2

嘗試以下操作:

SELECT order_id, item_id 
FROM orders 
INNER JOIN items ON (orders.color IS NULL OR orders.color = items.color) 
    AND (orders.size IS NULL OR orders.size = items.size) 

讓我知道是否有幫助,或者如果我誤解了這個問題。

+0

完美,謝謝! – user1895878

1

如果你重寫了條件JOIN就可以得到想要的結果:

SELECT order_id, item_id 
FROM orders 
JOIN items 
    ON ((orders.color = items.color OR orders.color IS NULL) 
     AND (orders.size = items.size OR orders.size IS NULL)) 

然而,訂單表應該看起來可能更像這個查詢比當前的訂單表的結果。

+0

這個工程,謝謝! – user1895878

1

您可以使用IFNULL功能如下:

SELECT order_id, item_id 
    FROM orders 
    JOIN items ON IFNULL(orders.color, items.color) = items.color 
      AND IFNULL(orders.size, items.size) = items.size 

如果訂單的價值爲null,則它會使用來自項目的值(並因此匹配)。

+0

這也適用,謝謝! – user1895878