如何在WHERE子句中引用在T-SQL中执行查询过程中创建的变量?

如何在WHERE子句中引用在T-SQL中执行查询过程中创建的变量?,sql,tsql,Sql,Tsql,标题上说的,真的 如果我选择[statement]作为WHERE,为什么我不能引用WHERE子句主体中的WHERE列?有什么解决办法吗?就我所知,您不能直接在SQL Server中执行此操作 如果确实必须在WHERE子句中使用列别名,则可以这样做,但仅对别名使用子查询似乎有些过分: SELECT * FROM ( SELECT [YourColumn] AS YourAlias, etc... FROM Whatever ) YourSubquery WHERE YourAlia

标题上说的,真的


如果我选择[statement]作为WHERE,为什么我不能引用WHERE子句主体中的WHERE列?有什么解决办法吗?就我所知,您不能直接在SQL Server中执行此操作

如果确实必须在WHERE子句中使用列别名,则可以这样做,但仅对别名使用子查询似乎有些过分:

SELECT *
FROM 
( 
   SELECT [YourColumn] AS YourAlias, etc...
   FROM Whatever
) YourSubquery
WHERE YourAlias > 2

几乎可以肯定,在WHERE子句中使用原始列的内容会更好。

据我所知,在SQL Server中无法直接执行此操作

如果确实必须在WHERE子句中使用列别名,则可以这样做,但仅对别名使用子查询似乎有些过分:

SELECT *
FROM 
( 
   SELECT [YourColumn] AS YourAlias, etc...
   FROM Whatever
) YourSubquery
WHERE YourAlias > 2

几乎可以肯定,在WHERE子句中使用原始列的内容会更好。

这与SELECT语句转换为抽象查询树的方式有关:“whatever”只出现在树的查询结果投影部分,即树的过滤部分上方,因此WHERE子句不能理解“WHERE”。这不是一些内部实现细节,而是关系查询的一个基本行为:结果的投影发生在连接和过滤器的计算之后

通过明确查询的层次结构来解决“问题”确实很简单:

select ...
  from (
    select [something] as whatever
    from ...
 ) as subquery
 WHERE whatever = ...;
公共表表达式也可以用于相同的目的:

with cte as (
    select [something] as whatever
    from ...)
select ... from cte
 WHERE whatever = ...;

它与SELECT语句转换为抽象查询树的方式有关:“whatever”只出现在树的查询结果投影部分中,该部分位于树的过滤部分之上,因此WHERE子句无法理解“whatever”。这不是一些内部实现细节,而是关系查询的一个基本行为:结果的投影发生在连接和过滤器的计算之后

通过明确查询的层次结构来解决“问题”确实很简单:

select ...
  from (
    select [something] as whatever
    from ...
 ) as subquery
 WHERE whatever = ...;
公共表表达式也可以用于相同的目的:

with cte as (
    select [something] as whatever
    from ...)
select ... from cte
 WHERE whatever = ...;

这与select语句中的操作顺序有关。WHERE子句在SELECT子句之前求值,因此此信息不可用。尽管它在ORDERBY子句中可用,因为它是最后处理的


正如其他人提到的,子查询可以解决这个问题。

它与select语句中的操作顺序有关。WHERE子句在SELECT子句之前求值,因此此信息不可用。尽管它在ORDERBY子句中可用,因为它是最后处理的

正如其他人提到的,子查询可以解决这个问题