2017-01-17 28 views
5

在SELECT語句中,我想重用WHERE子句中的計算列。有沒有辦法在SQLserver中這樣做?在WHERE子句中重複使用計算列

簡化的例子:

工作,但隨着重複計算:

SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
    WHERE concat(field2, field3) LIKE 'A%' 

期望:

SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
    WHERE calc_field LIKE 'A%' 
+0

您擔心您的第一個示例計算正在進行兩次? – AakashM

+0

@AakashM我擔心的不僅是關於它的計算是否做了兩次(不是很確定,它是在內部優化的?)......還有關於在更復雜的語句中重複編寫相同的代碼幾次。 – MarcM

+0

根據您希望過濾的頻率,可以在表格上放置一個計算列。 – cloudsafe

回答

6

無法重複使用同一級別上的計算字段SELECT。您需要嵌套它才能使用別名。

SELECT field1 
    , calc_field 
FROM (
    SELECT field1 
     , CONCAT (field2, field3) AS calc_field 
    FROM MyTable 
    ) tbl 
WHERE calc_field LIKE 'A%' 

This is because of the order in which clauses are executed in a SQL query。正如您在列出子句的方式中所看到的那樣,將生成別名的SELECT子句將在WHERE子句之後執行。

因此,該別名在WHERE子句中不是「可見的」,因爲別名是在應用WHERE之後生成的。

3

把它包起來在派生表:

select field1, calc_field 
from 
(
    SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
) dt 
WHERE calc_field LIKE 'A%' 
0

對於SQL Server,你可以使用級聯字段+使用的級聯標識

SELECT field1, field2 +field3 AS calc_field 
 
    FROM MyTable 
 
    WHERE field2 + field3 LIKE 'A%'

爲了獲得更好的性能避免WHERE子句。根據您的要求WHERE(場2 LIKE「A%」 OR場3 LIKE「A%」)可能是一個更好的選擇

1

使用子查詢來實現這一結果:

select field1, calc_field from 
(SELECT field1, concat(field2, field3) AS calc_field FROM MyTable 
) as dt 
WHERE calc_field LIKE 'A%' 
2

已有答案的另一個變化是使用公共表格表達式(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%'