【问题标题】:Use a calculated field in the where clause在 where 子句中使用计算字段
【发布时间】:2011-04-22 12:44:26
【问题描述】:

有没有办法在where 子句中使用计算字段?

我想做类似的事情

SELECT a, b, a+b as TOTAL FROM (
   select 7 as a, 8 as b FROM DUAL
   UNION ALL
   select 8 as a, 8 as b FROM DUAL
   UNION ALL
   select 0 as a, 0 as b FROM DUAL
)
WHERE TOTAL <> 0
;

但我得到ORA-00904: "TOTAL": invalid identifier

所以我必须使用

SELECT a, b, a+b as TOTAL FROM (
   select 7 as a, 8 as b FROM DUAL
   UNION ALL
   select 8 as a, 8 as b FROM DUAL
   UNION ALL
   select 0 as a, 0 as b FROM DUAL
)
WHERE a+b <> 0
;

【问题讨论】:

    标签: sql oracle plsql ora-00904


    【解决方案1】:

    逻辑上select 子句是查询的最后部分之一,因此别名和派生列不可用。 (order by 除外,逻辑上最后发生。)

    使用派生表不在此范围内:

    select * 
    from (SELECT a, b, a+b as TOTAL FROM ( 
               select 7 as a, 8 as b FROM DUAL 
               UNION ALL 
               select 8 as a, 8 as b FROM DUAL 
               UNION ALL 
               select 0 as a, 0 as b FROM DUAL) 
        )
    WHERE TOTAL <> 0 
    ; 
    

    【讨论】:

    • 我在存储过程中尝试这样做,除非我也为派生表设置别名,否则上述语法将不起作用。
    • @DilbertDave,很有趣。您在 Oracle 中尝试过吗?如果我没记错的话,SQL Server 总是要求给派生表加上别名。
    • OP 在询问不需要别名的 Oracle。我很高兴这个答案能够为您提供帮助,即使它是针对不同平台的。
    • 啊 - 刚刚注意到 Oracle 错误消息和标签 blush。尽管如此,它还是为我指明了正确的方向,所以赞成:-)
    【解决方案2】:

    这会起作用...

    select * 
    from (SELECT a, b, a+b as TOTAL FROM ( 
               select 7 as a, 8 as b FROM DUAL 
               UNION ALL 
               select 8 as a, 8 as b FROM DUAL 
               UNION ALL 
               select 0 as a, 0 as b FROM DUAL) 
        ) as Temp
    WHERE TOTAL <> 0; 
    

    【讨论】:

    • 这个答案很有用,因为额外的 as Temp 命名了内部查询。这对它的执行很重要,至少在 SQL Server 中是这样。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 2011-10-25
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多