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

问题描述 投票:-1回答:6

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

sql sql-server-2008-r2
6个回答
3
投票

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

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


2
投票

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

  1. 直接使用相同的表达式 - 这不是理想的,因为你需要重复自己,但对于小表达式,它通常是可以接受的
  2. 在另一个select中包含一个select - 这种方法允许你在外部select的WHERE子句中过滤内部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 = ...

1
投票

您不能,但您可以将案例放在子查询或公用表表达式中。

还可以查看此问题以获取更多信息:

Referencing a calculated column in the where clause SQL


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

注意:如果使用子查询,则向子查询提供ALIAS名称是强制性的,如上所示 - 否则将抛出错误。


0
投票

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

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

0
投票

你也可以使用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'
© www.soinside.com 2019 - 2024. All rights reserved.