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

时间:2015-02-09 13:29:52

标签: sql sql-server-2008-r2

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

运行此查询会报告错误&#34;无效的列名DerivedColumn1&#34;。

6 个答案:

答案 0 :(得分:3)

您无法直接引用WHERE中的别名(可以<{1}} ),您必须使用子查询或CTE(或重复ORDER BY中的CASE WHEN

WHERE

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

答案 1 :(得分:2)

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

  1. 直接使用相同的表达 - 这不太理想,因为您需要重复自己,但对于小表达式,通常可以接受
  2. 在另一个选择中包含一个选择 - 此方法允许您在外部选择的WHERE子句中过滤内部选择的列。
  3. 使用Common Table Expression - 此方法与上述方法类似,它允许您将select包装在另一个可以使用命名列的结构(CTE)中。
  4. 以下是最后一种方法的说明:

    WITH CTE (ActualColumn1, DerivedColumn1)
    AS
    (
        SELECT ActualColumn1,
        CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1
        FROM ...
    )
    SELECT ActualColumn1, DerivedColumn1
    FROM CTE
    WHERE DerivedColumn = ...
    

答案 2 :(得分:1)

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

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

Referencing a calculated column in the where clause SQL

答案 3 :(得分:1)

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

注意: 如果您使用子查询,将 ALIAS 名称提供给子查询必须,如上所示 - Z ,否则将引发错误。

答案 4 :(得分: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

答案 5 :(得分: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'