SQL:查询2列;如果一个有效则忽略另一个

时间:2010-03-11 08:41:41

标签: sql oracle oracle10g

我不确定如何处理这个SQL语句所以请指教,即使它只是指向我可以阅读的内容的指针

我有一张表,例如以下

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

ID是唯一的,我需要做的是创建一个将返回ID的SELECT语句,然后是'Over 60'或'Over 80',例如:

ID        AGE
2         Over 60
3         Over 80

我需要避免的是重复,这意味着如果某人是'超过80岁',那么就不需要显示'超过60',因为它非常明显

我看了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 个答案:

答案 0 :(得分:3)

您应该可以使用CASE STATEMENT

Something 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 :(得分:1)

CASE,IF,COALESCE - 这里有各种方法。很大程度上取决于您使用的数据库服务器;)

答案 2 :(得分:1)

如果你想要很好地扩展,正确的方法是重新设计你的表。像casecoalesce这样的每行功能无法扩展。

根本不存储数据库中是否超过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只会计算一次