我想我正在敲打我的头脑比我应该做的更多.我有这个简单的查询:
SELECT * FROM opening_hours WHERE day_id = 3 OR day_id IS NULL
Run Code Online (Sandbox Code Playgroud)
这将为我提供在day_id列中同时具有3和NULL的所有行,并且如果找不到3,它将仅给出具有NULL的行.如果找到3,如何禁止具有NULL的行,如果找不到3则如果给出带NULL的行?
有没有办法在一个查询中执行此操作?我也尝试过XOR,它只会给我找到3的行,但如果没有则没有.
一种可能的方式:
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
Run Code Online (Sandbox Code Playgroud)
另一种可能方式:
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
)
Run Code Online (Sandbox Code Playgroud)
或者,使用联接:
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
Run Code Online (Sandbox Code Playgroud)