在WHERE子句中重用计算列

Mar*_*rcM 5 sql t-sql sql-server

在SELECT语句中,我想在WHERE子句中重用计算列.有没有办法在SQLserver中这样做?

简化示例:

工作,但重复计算:

SELECT field1, concat(field2, field3) AS calc_field
  FROM MyTable
  WHERE concat(field2, field3) LIKE 'A%'
Run Code Online (Sandbox Code Playgroud)

期望:

SELECT field1, concat(field2, field3) AS calc_field
  FROM MyTable
  WHERE calc_field LIKE 'A%'
Run Code Online (Sandbox Code Playgroud)

Rad*_*hiu 6

无法在同一级别重用计算字段SELECT.您需要嵌套它才能使用别名.

SELECT field1
    , calc_field
FROM (
    SELECT field1
        , CONCAT (field2, field3) AS calc_field
    FROM MyTable
    ) tbl
WHERE calc_field LIKE 'A%'
Run Code Online (Sandbox Code Playgroud)

这是因为在SQL查询中执行子句的顺序.正如您在列出子句的方式中所看到的,SELECT生成别名的WHERE子句在子句之后执行.

因此,别名在WHERE子句中不是"可见的" ,因为别名是在WHERE应用后生成的.


Sal*_*n A 5

现有答案的另一个变体是使用公用表表达式 (CTE):

WITH cte AS (
    SELECT field1, concat(field2, field3) AS calc_field
    FROM mytable
)
SELECT field1, calc_field
FROM cte
WHERE calc_field LIKE 'A%'
Run Code Online (Sandbox Code Playgroud)

你也可以滥用CROSS APPLY

SELECT field1, ca.calc_field
FROM MyTable
CROSS APPLY (
    SELECT concat(field2, field3) AS calc_field
) AS ca
WHERE ca.calc_field LIKE 'A%';
Run Code Online (Sandbox Code Playgroud)