【问题标题】:How to select based on different column data如何根据不同的列数据进行选择
【发布时间】:2013-07-04 06:40:03
【问题描述】:

我想根据列数据执行不同的 SELECT。例如,我有一个表http://sqlfiddle.com/#!2/093a2,只有当 use_schedule = 1 时,我才想比较 start_date 和 end_date。否则选择所有数据。 (不同的选择)基本上我只想比较开始日期和结束日期,如果只有 use_schedule 为 1,如果 use_schedule 为 0,则选择其余数据。

一个例子可能是这样的

select id, name from table
where use_schedule = 0 
else 
select id, name, start_date from table 
where use_schedule = 0 and current_date >= start_date.

基本上,我只有启用计划的数据,然后查看开始和结束日期。因为如果未启用计划,则没有必要查看日期。只需选择数据。启用计划后,我希望在选择计划数据时更有选择性。

我试图弄清楚 MySQL CASE 或 IF 语句是否可以工作,但不能这样做。如何运行此选择?

谢谢。

【问题讨论】:

  • 你想比较 start_date 和 end_date 是什么意思?如果在结束之后开始?开始是以前?请提供更多数据。
  • 基本上我有启用计划的数据,然后查看开始和结束日期。因为如果未启用计划,则没有必要查看日期。只需选择数据。启用计划后,我希望在选择计划数据时更有选择性。
  • 好的,现在我得到了更好的问题,将其添加到问题中以便更好地解释。我看到你只把“mysql”作为一个标签,你也使用服务器端语言吗?
  • 我正在使用 LUA,在 MySQL 之外执行此操作没什么大不了的。我只是想删掉 1 个查询。

标签: mysql sql select if-statement


【解决方案1】:

使用 CASE,在这种情况下..:

SELECT id, name, 
   (CASE 
        WHEN start_date >= DATE(NOW()) AND use_schedule = 1 
        THEN start_date 
    ELSE NULL 
    END) AS cols FROM campaigns

这样它只选择时间表 0 或日期大于或等于现在的 1; 我使用了 DATE(NOW()) 以便删除您不感兴趣的时间。

【讨论】:

    【解决方案2】:

    您可以使用UNION 将 2 个不同 SQL 查询的结果混合匹配到一个结果集中:

    select id, name, null from table
    where use_schedule = 0 
    union 
    select id, name, start_date from table 
    where use_schedule = 1 and current_date >= start_date
    

    请注意,两个查询必须具有兼容的输出字段(相同的数字和类型才能工作)。使用 UNION 会自动仅合并不同的记录 - 如果您想保留双重结果,请改用 UNION ALL

    在这种特定情况下,更广泛的WHERE-clause 显然也可以工作:

    where use_schedule = 0 or (use_schedule = 1 and current_date >= start_date)
    

    但是考虑到这个问题,我假设你的真实情况要复杂一些。

    Documentation over at MySQL site.

    【讨论】:

    • Union 实际上是两个 SELECT,这是我试图避免的。如果 2 SELECTS 是选项,我可以用我的编程语言做到这一点。您的解决方案完美无缺,但让我们看看我们是否能找出更有效的方法?
    • 2 个选择的联合比内部的 2 个单独选择要高效得多。
    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2013-08-21
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多