【问题标题】:Use column number from select clause in where clause. Extracting allias original name在 where 子句中使用 select 子句中的列号。提取别名原名
【发布时间】:2012-03-26 03:08:05
【问题描述】:

假设我有这样的查询

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

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

【问题讨论】:

  • 你为什么要这样做?
  • @JohnSaunders,因为可能被别名的东西是一个复杂的表达式,你不想在 where 子句中重复。

标签: sql oracle oracle11g


【解决方案1】:

由于关于何时评估 WHERE 子句的内部复杂性,无法执行此操作。但是,如果您要别名的东西是一个您不想重复的长表达式,那么有一个典型的解决方案。来自https://forums.oracle.com/forums/thread.jspa?threadID=1107532

对此的标准解决方案是将查询移动到内联 查看(没有 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

【讨论】:

    【解决方案2】:

    使用common table expression (CTE) 例如

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

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2012-01-12
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多