所以,可以说,我有这样的使用where子句中select子句的列号。提取allias原名
SELECT a as d,b,c FROM myTable
WHERE a=1;
查询是否有可能代替 A = 1键入类似SELECTED.1 = 1或以某种方式提取allias因为d原来的名字= 1不起作用
所以,可以说,我有这样的使用where子句中select子句的列号。提取allias原名
SELECT a as d,b,c FROM myTable
WHERE a=1;
查询是否有可能代替 A = 1键入类似SELECTED.1 = 1或以某种方式提取allias因为d原来的名字= 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
使用common table expression (CTE)例如
WITH T
AS
(
SELECT a as d, b, c
FROM myTable
)
SELECT *
FROM T
WHERE d = 1;
为什么要这么做? – 2012-03-26 03:09:30
@JohnSaunders,因为也许别名是一个复杂的表达式,你不想在where子句中重复。 – 2012-03-26 03:14:56