如何根据派生列名过滤 WHERE 子句中的数据?

How to filter data in a WHERE clause based on a derived column name?

我正在使用 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

运行 该查询报错"Invalid column name DerivedColumn1".

你不能,但你可以将大小写放在子查询或普通 table 表达式中。

另请检查此问题以获取更多信息:

Referencing a calculated column in the where clause SQL

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

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

虽然您无法直接使用派生列,但您可以通过多种方式获得所需的结果:

  1. 直接使用相同的表达式 - 这并不理想,因为你需要重复自己,但对于小表达式通常是可以接受的
  2. 将一个 select 包裹在另一个 select 中 - 这种方法允许您过滤 [=] 中内部 select 的列11=] 外层子句 select.
  3. 使用 Common Table Expression - 这种方法类似于上面的方法,因为它允许您将 select 包装在另一个结构 (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 = ...

您不能直接从 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' 

相关:Reference alias (calculated in SELECT) in WHERE clause

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

注意: 如果您使用子查询,给子查询 ALIAS 名称是 compulsory ,如上所示 - Z 否则会出错被抛出。

您也可以使用 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'