如何根据派生列名过滤 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
虽然您无法直接使用派生列,但您可以通过多种方式获得所需的结果:
- 直接使用相同的表达式 - 这并不理想,因为你需要重复自己,但对于小表达式通常是可以接受的
- 将一个 select 包裹在另一个 select 中 - 这种方法允许您过滤 [=] 中内部 select 的列11=] 外层子句 select.
- 使用 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'
我正在使用 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
虽然您无法直接使用派生列,但您可以通过多种方式获得所需的结果:
- 直接使用相同的表达式 - 这并不理想,因为你需要重复自己,但对于小表达式通常是可以接受的
- 将一个 select 包裹在另一个 select 中 - 这种方法允许您过滤 [=] 中内部 select 的列11=] 外层子句 select.
- 使用 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'