2017-01-17 15 views
5

SELECT文では、WHERE句で計算列を再利用します。 SQL Serverでこれを行う方法はありますか?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

最初の例で計算が2回実行されていることに心配していますか? – AakashM

+0

@AakashM私の懸念は、計算が2回行われただけでなく、内部的に最適化されているかどうかということだけでなく、より複雑なステートメントで同じコードを何度も書き直すことについてです。 – 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の場合、あなたはWHERE句で連結フィールドを使用して連結識別子より良い性能の回避のために

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

として+を使用することができます。 (フィールド2 LIKE「%」ORフィールド3 LIKE「%」)がより良いオプションこの結果を達成するために、サブクエリを使用し

1

かもしれない、あなたの要件に応じて:既存の回答の

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

もう一つの変化があります

WITH cte AS (
    SELECT field1, concat(field2, field3) AS calc_field 
    FROM mytable 
) 
SELECT field1, calc_field 
FROM cte 
WHERE calc_field LIKE 'A%' 
関連する問題