2010-03-11 39 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