如何根据派生列名筛选WHERE子句中的数据



我使用的是SQL Server 2008 R2。我希望在派生的列上有一个WHERE子句。

我有这样的东西:

SELECT ActualColumn1, 
CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1
FROM
...
WHERE
DerivedColumn1 <> 'Foo' -- I'd like to filter on the derived column

运行此查询会报告错误"无效列名Derived11"。

您不能直接从WHERE引用别名(您可以从ORDER BY引用),您必须使用子查询或CTE(或在WHERE中重复CASE WHEN):

WITH CTE AS
(
    SELECT ActualColumn1, 
    CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1
    FROM
    ...
)
SELECT ActualColumn1, DerivedColumn1 
FROM CTE
WHERE DerivedColumn1 <> 'Foo' 

相关:WHERE子句中的引用别名(在SELECT中计算)

不能,但可以将大小写放入子查询或公共表表达式中。

查看此问题以了解更多信息:

引用where子句SQL 中的计算列

虽然派生列不能直接使用,但有几种方法可以实现所需的结果:

  1. 直接使用相同的表达式-这并不理想,因为你需要重复自己,但对于小表达式,这通常是可以接受的
  2. 将一个select包裹在另一个select中-这种方法允许您在外部select的WHERE子句中筛选内部select的列
  3. 使用通用表表达式-此方法与上面的方法类似,因为它允许您将选择封装在另一个结构(CTE)中,您可以在该结构上使用命名列

以下是最后一种方法的示例:

WITH CTE (ActualColumn1, DerivedColumn1)
AS
(
    SELECT ActualColumn1,
    CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1
    FROM ...
)
SELECT ActualColumn1, DerivedColumn1
FROM CTE
WHERE DerivedColumn = ...
SELECT * FROM (
SELECT ActualColumn1, 
CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1
FROM
...
) Z
WHERE
DerivedColumn1 <> 'Foo'

注意:如果使用子查询,则必须为子查询指定ALIAS名称,如上所示-否则将引发错误。

你不能直接使用它,但你可以这样做:

select * from
(
SELECT ActualColumn1, 
CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1
FROM
...
)
WHERE
DerivedColumn1 <> 'Foo' -- I'd like to filter on the derived column

您也可以使用CROSS APPLY

SELECT tbl.ActualColumn1, cap.DerivedColumn1
FROM ... as tbl
CROSS APPLY (SELECT CASE WHEN condition THEN value1 ELSE value2 END) AS cap(DerivedColumn1)
WHERE cap.DerivedColumn1 <> 'Foo'

最新更新