2013-12-14 38 views
4

我覺得我在這個問題上比我應該做得更多。 我有這個簡單的查詢:MYSQL:如何在'WHERE'子句中回退到'IS NULL'

SELECT * FROM opening_hours WHERE day_id = 3 OR day_id IS NULL 

哪位能給我兼得,3和NULL在day_id列中的所有行,如果沒有找到3它將給只有那些與NULL。 如果找到3,我該如何阻止那些有NULL的行,如果沒有找到3,那麼給我替換那些帶有NULL的行?

有沒有辦法在一個查詢中做到這一點?我也試過XOR,它會給我找到3的行,但如果沒有的話。

+0

我想你應該向我們提供的樣本數據和所需的輸出。目前感覺所有你需要的是1排結果。 –

回答

5

一種可能的方式:

SELECT * FROM opening_hours WHERE CASE 
    WHEN EXISTS(SELECT * FROM opening_hours WHERE day_id = 3) THEN day_id = 3 
    ELSE day_id IS NULL 
END 

另一種可能的方式:

SELECT * FROM opening_hours WHERE day_id <=> (
    SELECT day_id 
    FROM  opening_hours 
    WHERE day_id = 3 OR day_id IS NULL 
    ORDER BY day_id DESC 
    LIMIT 1 
) 

或者,使用連接:

SELECT * FROM opening_hours NATURAL JOIN (
    SELECT MAX(day_id) AS day_id 
    FROM opening_hours 
    WHERE day_id = 3 OR day_id IS NULL 
) t 
+0

我試過第一種方式,它的功能就像一個魅力。非常感謝。 –