如何根据不同的列数据进行选择

Posted

技术标签:

【中文标题】如何根据不同的列数据进行选择【英文标题】: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 个查询。 【参考方案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 个单独选择要高效得多。

以上是关于如何根据不同的列数据进行选择的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 3 个不同的列在 mysql 中选择行

如何根据不同的列选择整行

如何根据不同的列合并行(可以查询吗?)

根据第三列值在 bigquery 中选择两个不同的列

Oracle:根据不同列的值选择不同的列

根据haversine距离公式选择不同的列值?