我想实现这样的事情:再利用化名场SQL SELECT语句
SELECT
(CASE WHEN ...) AS FieldA,
FieldA + 20 AS FieldB
FROM Tbl
假设由“...”我已经更换了一个漫长而复杂CASE声明, 我不想在选择FieldB
时重复,而是使用别名FieldA
代替。
请注意,这将返回多行,因此SELECT
声明之外的DECLARE
/SET
对我而言并不好。
我想实现这样的事情:再利用化名场SQL SELECT语句
SELECT
(CASE WHEN ...) AS FieldA,
FieldA + 20 AS FieldB
FROM Tbl
假设由“...”我已经更换了一个漫长而复杂CASE声明, 我不想在选择FieldB
时重复,而是使用别名FieldA
代替。
请注意,这将返回多行,因此SELECT
声明之外的DECLARE
/SET
对我而言并不好。
一个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
当我有复杂的逻辑来计算来自表中其他列值的“虚拟”列值我通常会创建原始表的单表视图,其中还包含所有原始列和计算值。然后我对视图做其他SELECT。这允许我:
命名我的计算列。
将计算的逻辑保存在一个地方,而不是通过应用程序中的各种查询分散。
你知道这是否对性能更好? – Fractaliste 2014-05-13 12:29:14
除非*您使用提供物化视图的引擎,并且将其创建为物化视图,否则性能*不会产生任何影响,在这种情况下,您将降低写入性能,但会提高查询性能。 – 2014-05-13 14:42:16
或者可能是CTE以增强可读性。 – JohnFx 2010-03-15 14:28:54
@JohnFx:好点,延长我的答案。 – 2010-03-15 14:43:32
我个人认为派生表更容易阅读,但那只是我。 – HLGEM 2010-03-15 21:19:19