2010-03-15 86 views
9

我想實現這樣的事情:再利用化名場SQL SELECT語句

SELECT 
    (CASE WHEN ...) AS FieldA, 
    FieldA + 20 AS FieldB 
FROM Tbl 

假設由「...」我已經更換了一個漫長而複雜CASE聲明, 我不想在選擇FieldB時重複,而是使用別名FieldA代替。

請注意,這將返回多行,因此SELECT聲明之外的DECLARE/SET對我而言並不好。

回答

11

一個workaroud是使用一個子查詢:

SELECT 
    FieldA, 
    FieldA + 20 AS FieldB 
FROM (
    SELECT 
    (CASE WHEN ...) AS FieldA 
    FROM Tbl 
) t 

爲了提高可讀性,你也可以使用一個CTE

WITH t AS (
    SELECT 
    (CASE WHEN ...) AS FieldA 
    FROM Tbl 
) 
SELECT 
    FieldA, 
    FieldA + 20 AS FieldB 
FROM 
    t 
+2

或者可能是CTE以增強可讀性。 – JohnFx 2010-03-15 14:28:54

+0

@JohnFx:好點,延長我的答案。 – 2010-03-15 14:43:32

+0

我個人認爲派生表更容易閱讀,但那只是我。 – HLGEM 2010-03-15 21:19:19

3

當我有複雜的邏輯來計算來自表中其他列值的「虛擬」列值我通常會創建原始表的單表視圖,其中還包含所有原始列和計算值。然後我對視圖做其他SELECT。這允許我:

  1. 命名我的計算列。

  2. 將計算的邏輯保存在一個地方,而不是通過應用程序中的各種查詢分散。

+0

你知道這是否對性能更好? – Fractaliste 2014-05-13 12:29:14

+0

除非*您使用提供物化視圖的引擎,並且將其創建爲物化視圖,否則性能*不會產生任何影響,在這種情況下,您將降低寫入性能,但會提高查詢性能。 – 2014-05-13 14:42:16