2013-07-06 110 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()),因此,它消除了你不感興趣的時候