2012-03-26 29 views
7

所以,可以说,我有这样的使用where子句中select子句的列号。提取allias原名

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

查询是否有可能代替 A = 1键入类似SELECTED.1 = 1或以某种方式提取allias因为d原来的名字= 1不起作用

+3

为什么要这么做? – 2012-03-26 03:09:30

+1

@JohnSaunders,因为也许别名是一个复杂的表达式,你不想在where子句中重复。 – 2012-03-26 03:14:56

回答

10

由于关于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