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)
无法在同一级别重用计算字段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应用后生成的.
现有答案的另一个变体是使用公用表表达式 (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)