2011-03-30 82 views
0

我目前有兩個SQL語句,我想合併成一個,並設置一個狀態,如果它滿足每個。我下面貼一些大規模精簡代碼:結合兩個SQL語句,設置狀態

select * from database where date1 < SYSDATE 
select * from database where date2 < SYSDATE 

理想情況下,我想它,如果它符合標準中的第一條語句,它會設置「狀態1」的標誌,如果它不達不到這個標準,但符合第二條陳述的標準,我想設置'status2'的標誌 - 希望是有道理的!

例如,數據將如下所示:Name | ID |狀態

謝謝:)

+0

你使用的是什麼RDBMS? Status1或Status2在哪裏?它們是表中的列還是表中的值?這個「數據庫」表是否與您正在更新的表相關?您的預期結果並非真正100%清晰。 – codingbadger 2011-03-30 16:11:38

+0

'sysdate'表示它是Oracle(或與Oracle兼容性打開的DB2) – 2011-03-30 16:12:46

回答

1

給這一個鏡頭:

select Name, ID, CASE 
    WHEN date1 < SYSDATE THEN 1 
    WHEN date2 < SYSDATE THEN 2 
END as Status 
from mytable 
where date1 < SYSDATE or date2 < SYSDATE 
+0

許多令人敬畏的回覆,但這是我認爲的完美工作方式(儘管我很欣賞其他解決方案也是如此),並返回我需要。喜歡這個網站,謝謝! – Nick 2011-03-30 16:18:07

1
select * 
from ( 
    select name, id, 'status1' as status 
    from some_table 
    where date1 < SYSDATE 

    UNION ALL 

    select name, id, 'status2' 
    from some_table 
    where date2 < SYSDATE 
) 
+0

沒有想到使用UNION聲明,噢!這是一個很好的解決方案,謝謝:) – Nick 2011-03-30 16:19:21

1
UPDATE mytable 
SET  flag = 
     CASE 
     WHEN date1 < SYSDATE THEN 
       'status1' 
     ELSE 
       'status2' 
     END 
WHERE date1 < SYSDATE 
     OR 
     date2 < SYSDATE     
+0

就像我對本說的那樣,這是一個很棒的解決方案 - 謝謝! – Nick 2011-03-30 16:19:48

1

既然你說你想UPDATE狀態...

UPDATE database 
SET flag = CASE WHEN date1 < SYSDATE THEN 'status1' WHEN date2 < SYSDATE THEN 'status2' ELSE NULL END 
+0

這是一個很好的解決方案,謝謝 - 我實際上正在編寫一個新的視圖,但更新主數據庫中的一個標誌實際上可能是更好的解決方案! – Nick 2011-03-30 16:18:56