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

SQL:查询2列;如果一个有效,则忽略另一个,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我不知道如何处理这个SQL语句,所以请给出建议,即使它只是指向我可以读懂的东西的指针 我有一张桌子,如下所示 ID OVER60 OVER80 1 N N 2 Y N 3 Y Y ID是唯一的,我需要做的是创建一个SELECT语句来返回ID,然后选择“超过60”或“超过80”,例如: ID AGE 2 Over 60 3

我不知道如何处理这个SQL语句,所以请给出建议,即使它只是指向我可以读懂的东西的指针

我有一张桌子,如下所示

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”,因为这是非常明显的

我已经看过工会,看看这是否会有帮助,这就是我目前所做的:

  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'

    ;
我有什么选择?用负号能帮我吗


谢谢

您应该能够使用

类似的东西

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'

您应该能够使用一个

类似的东西

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'

案例,如果,合并-各种方法在这里是可能的。很大程度上取决于您使用的数据库服务器

情况,如果,合并-这里可以使用各种方法。很大程度上取决于您使用的数据库服务器

如果您想更好地扩展,正确的方法是重新设计您的表。每行函数(如case和coalesce)不可缩放

根本不在数据库中存储他们是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;

如果有一个关于出生日期的索引,这应该会让人大吃一惊,因为除非数据库管理系统是脑死亡的,否则现在-N年只能计算一次。

如果你想更好地扩展,正确的方法是重新设计你的表。每行函数(如case和coalesce)不可缩放

根本不在数据库中存储他们是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;

如果有一个关于出生日期的指数,那就应该大惊小怪了,因为除非数据库管理系统是脑死亡的,否则现在-N年只能计算一次。

其中a.OVER_80='Y'是多余的感谢Astander,我使用的是你建议的解决方案,因此在此基础上接受。再次感谢a.OVER_80='Y'是多余的感谢Astander,我正在使用您建议的解决方案,因此在此基础上接受。谢谢Hanks Pax,是的,如果我有机会,我会重新执行表格,但不幸的是,我没有时间这样做,因此需要一个案例。我明白你的意思,希望能从中吸取教训+1无论如何,谢谢你,是的,如果我有机会,我会重新执行表格,但不幸的是,我没有时间这样做,因此需要一个案例。我明白你的意思,希望能从中吸取教训+1无论如何