2010-03-15 68 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