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

标签 mysql sql

我想我在这方面的努力超出了我应有的程度。 我有这个简单的查询:

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

这将给我所有在 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

另一种可能的方式:

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

关于MYSQL:如何在 'IS NULL' 子句中回退到 'WHERE',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20586732/

相关文章:

mysql - 构建在每个 View 中显示不同的日志表的最佳方法是什么?

mysql - 在大型 SQL 中运行复杂查询的最快方法

MySQL 字符编码

php - Laravel 中 undefined variable : task (View: C:\Users\13\Desktop\TDT\resources\views\files\form.blade.php)

Mysql 复制不适用于不同的数据库引擎?

sql - 在 Dbeaver 上创建 Postgres 表时不能使用 "GENERATED ALWAYS AS IDENTITY"?

mysql - 玛丽亚数据库 (MySQL) :Query slow when using sub query

php - 将瑞典语字符插入 opencart 表

php - 如何让 GROUP_CONCAT 查询返回更多一行?

sql - 插入、更新、删除后将数据输入到具有序列的日志表中的 PL/SQL 触发器