在“where”子句中使用新列

时间:2014-01-16 21:28:07

标签: sql hive

hive拒绝此代码:

select a, b, a+b as c
from t
where c > 0

Invalid table alias or column reference 'c'

我真的需要写一些像

这样的东西
select * from 
(select a, b, a+b as c
 from t)
where c > 0

编辑:

  1. c的计算很复杂,我不想在where a + b > 0中重复它
  2. 我需要一个可以在hive
  3. 中使用的解决方案

5 个答案:

答案 0 :(得分:2)

如果要使用派生列,请使用公用表表达式。

with x as
(
select a, b, a+b as c
from t
)
select * from x where c >0

答案 1 :(得分:1)

它必须如下所示:

select a, b, a+b as c
from t
where a+b > 0

解释/记住这一点的简单方法是:SQL不能引用在其自己的实例中分配的别名。但是,如果你这样做,它会起作用:

SELECT a,b,c
FROM(
select a, b, a+b as c
from t) as [calc]
WHERE c > 0

此语法可行,因为别名是在子查询中分配的。

答案 2 :(得分:1)

您可以像这样或使用公用表表达式

运行此查询
select a, b, a+b as c
from t
where a+b > 0

引用逻辑查询处理的以下操作顺序,以了解是否可以在另一个子句中使用派生列。

键入命令

  1. 选择
  2. FROM
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. ORDER BY
  7. 逻辑查询处理阶段

    1. FROM
    2. WHERE
    3. GROUP BY
    4. HAVING
    5. 选择
    6. ORDER BY

答案 3 :(得分:0)

你很近,你可以这样做

select a, b, a+b as c
from t
where a+b > 0

答案 4 :(得分:0)

没有

只是:

选择a,b,a + b作为c 从T 其中a + b> 0

注意:至少对于mysql:order by和group by你可以使用列(或表达式)位置

e.g。 group by 2,order by 1将为每列2(无论是字段名称还是表达式)获取一行,并按列1(字段或表达式)对其进行排序

另外:某些RDBMS确实允许您在第一次尝试时引用列别名