2013-07-06 78 views
6

我想根据列数据执行不同的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语句是否可以工作,但不能这样做。我怎样才能运行这个选择?

谢谢。

+0

你是什么意思,你想比较start_date和end_date? IF如果在结束后开始?开始之前?请提供更多数据。 –

+0

基本上我有数据在哪里启用日程安排,然后查看开始和结束日期。因为如果日程安排未启用,则无法查看日期。只需选择数据。启用计划后,我希望在选择计划数据时更具选择性。 – NBhatti

+0

好吧,现在我可以更好地解决这个问题,将其添加到问题中,以便更好地解释。我看到你只将“mysql”作为标签,你是否也使用服务器端语言? –

回答

1

您可以使用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

+0

联盟实际上是两个SELECT,这是我试图避免的。如果选择2个SELECTS,我可以用我的编程语言来完成这个任务。您的解决方案完美无瑕,但让我们看看我们是否可以找出更有效的方法? – NBhatti

+0

2选择的联合比内部的2个独立选择有效得多。 –

1

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

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()),因此,它消除了你不感兴趣的时候