使用where子句中select子句的列号。提取别名原始名称

时间:2012-03-26 03:08:06

标签: sql oracle oracle11g

所以我想说我有这样的查询

    SELECT a as d,b,c FROM myTable
    WHERE a=1;

是否可以代替 a = 1键入类似SELECTED.1 = 1或以某种方式提取allias原始名称,因为d = 1不起作用

2 个答案:

答案 0 :(得分:10)

由于关于何时评估WHERE子句的内部复杂性,不可能这样做。但是如果你是混淆的东西是一个你不想重复的长表达式,那么就有一个典型的解决方案。来自https://forums.oracle.com/forums/thread.jspa?threadID=1107532

  

对此的标准解决方案是,您将查询移动到内联中   view(没有where子句谓词),然后添加   where子句谓词,在外部查询中使用别名。

     

这样的事情:

select ...
from (select ... here complex expression that is aliased ...
      from ...
      where ) A
where ... here condition that uses the A.alias column ...

在您的示例中,那将是:

SELECT d, b, c
FROM ( SELECT a AS d, b, c FROM myTable ) AS myAliasedTable
WHERE d = 1

但是,当然,这在你的文字例子中没有意义。如果你是别名的东西只是一个列名,那么只需在WHERE中使用实际的列名,在这种情况下没有真正的缺点。

另请注意,如果使用此方法,则应尽可能多地在内部查询中添加WHERE子句(意味着不引用别名列的部分)以限制生成的别名的大小表。例如,如果您还想在示例中对b进行测试,那将是:

SELECT d, b, c
FROM (
    SELECT a AS d, b, c
    FROM myTable
    WHERE b = 1
) AS myAliasedTable
WHERE d = 1

答案 1 :(得分:2)

使用common table expression (CTE)例如

WITH T 
     AS 
     (
      SELECT a as d, b, c 
        FROM myTable
     )
SELECT * 
  FROM T
 WHERE d = 1;