2010-03-11 71 views
1

我不知道如何處理這個SQL語句,所以請告知,即使它只是一個指針的東西我可以SQL:查詢2列;如果有效,則忽略其他

我有一個表,如讀了以下

ID  OVER60  OVER80 
1   N   N 
2   Y   N 
3   Y   Y 

的ID都是唯一的,我需要做的是建立一個SELECT語句,將返回的ID,然後或者「超過60」或「80多個」,如:

ID  AGE 
2   Over 60 
3   Over 80 

我需要避免的是,是重複的,這意味着如果有人「超過80」,那麼就沒有必要「超過60」顯示aswel,因爲它很明顯

我已經看了UNION,看看是否要幫忙的,這是什麼我到目前爲止:

SELECT 
    a.id, 
    'OVER60' as AGE 
    FROM 
    MY_TABLE a 
    WHERE 
    a.OVER_60 != 'N' 
UNION 
    SELECT 
    a.id, 
    'OVER80' as AGE 
    FROM 
    MY_TABLE a 
    WHERE 
    a.OVER_80 != 'N' 

    ; 

我的選擇是什麼?會使用MINUS幫助我嗎?

感謝

回答

3

您應該能夠使用這個CASE STATEMENT

東西IKE

SELECT a.ID, 
     CASE  
      WHEN a.OVER_80 = 'Y' THEN 'OVER80' 
      WHEN a.OVER_60 = 'Y' THEN 'OVER60' 
     END 
FROM MY_TABLE 
WHERE a.OVER_60 = 'Y' 
+1

哪裏對於a.OVER_80 ='Y'是多餘的 – TFD 2010-03-11 08:53:50

+0

是的,這似乎是正確的,修復它。 – 2010-03-11 09:04:20

+1

非常感謝Astander,我正在使用您建議的解決方案,以便在此基礎上接受。再次感謝 – Jimmy 2010-03-11 09:39:34

1

情況下,如果,COALESCE - 各種方法都可能在這裏。很大程度上取決於您使用的數據庫服務器;)

+0

+1,謝謝;) – Jimmy 2010-03-11 09:41:08

1

正確的方式來做到這一點,如果你想擴展好,就是重新設計你的表。每行功能如case和​​3210不能縮放。

不要在數據庫中存儲它們是否超過60或80。首先,隨着時間的推移,這是一個變化的事情。存儲他們的生日是一個不變的。

然後只需運行:

select a.id, 'over 60' from my_table 
    where birthdate < now() - 60 years 
    and birthdate >= now() - 80 years 
union all select a.id, 'over 80' from my_table 
    where birthdate < now() - 80 years; 

隨着生日的指標,應該尖叫一起,因爲,除非是DBMS腦死亡,now() - N years將只計算一次

+0

謝謝帕克斯,是的,如果我有oppurtunity我會重新實現表,但不幸的是我沒有時間這樣做,因此需要一個CASE。我明白你的意思,並希望從中學習;) +1 – Jimmy 2010-03-11 09:38:44