【问题标题】:Select one row matching condition or first, if there aren't any选择一个行匹配条件或第一个,如果没有
【发布时间】:2014-05-11 20:01:19
【问题描述】:

我有一张包含一些数据的表格。看起来是这样的:

MariaDB [lokatnik]> SELECT id_elixir, start_time FROM elixir ORDER BY start_time ASC;
+-----------+------------+
| id_elixir | start_time |
+-----------+------------+
|         3 | 00:00:00   |
|         1 | 12:30:00   |
|         2 | 13:30:00   |
+-----------+------------+
3 rows in set (0.00 sec)

现在,我需要准确地选择一行匹配时间条件 - 比如 - start_time > some_time。

例如:

  • 当 some_time 是 10:00 时,我需要 id_elixir = 1 的行(时间超过 10:00 的第一行),
  • 当 some_time 是 13:00 时,我需要一行 id_elixir = 2(如上),
  • 当 some_time 是 14:00 时,我需要 id_elixir = 3 的行。

如何使用 SQL(和 MySQL/MariaDB DBMS)获取该行?

【问题讨论】:

  • start_time 列数据类型是什么?
  • 将时间与 00:00:00 进行比较几乎是不可能的,因为它可能是同一天的午夜或第二天的午夜。所以> '14:00' 将失败并返回意外结果。

标签: mysql sql mariadb


【解决方案1】:

也许,这样的事情对你有用:

SELECT
  *
FROM
  elixir
WHERE
  CASE
    WHEN start_time BETWEEN CAST('10:00:00' AS TIME) AND CAST('13:00:00' AS
      TIME)
    THEN id =1
    WHEN start_time BETWEEN CAST('13:00:00' AS TIME) AND CAST('14:00:00' AS
      TIME)
    THEN id         =2
    WHEN start_time > CAST('14:00:00' AS TIME)
    THEN id         =3
    ELSE true

但您实际上可以通过使用简单的布尔运算符来检查:

SELECT
  *
FROM
  elixir
WHERE
  (
    start_time BETWEEN CAST('10:00:00' AS TIME) AND CAST('13:00:00' AS TIME)
  AND id =1
  )
OR
  (
    start_time BETWEEN CAST('13:00:00' AS TIME) AND CAST('14:00:00' AS TIME)
  AND id =2
  )
OR
  (
    start_time > CAST('14:00:00' AS TIME)
  AND id       =3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多