MYSQL:如何在'WHERE'子句中回退到'IS NULL'

A.M*_*.P. 4 mysql sql

我想我正在敲打我的头脑比我应该做的更多.我有这个简单的查询:

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的行,但如果没有则没有.

egg*_*yal 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
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)