我正在使用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
运行此查询会报告错误“无效的列名DerivedColumn1”。
你不能直接从WHERE
引用别名(你可以从ORDER BY
),你必须使用子查询或CTE(或重复CASE WHEN
中的WHERE
):
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的列。以下是最后一种方法的说明:
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'