如何根据不同的列数据进行选择
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 个单独选择要高效得多。以上是关于如何根据不同的列数据进行选择的主要内容,如果未能解决你的问题,请参考以下文章