简化使用变量的 SQL 查询

3

我希望简化我的T-SQL查询。它长这样:

SELECT

    t.a AS [Column A], 
    t.b AS [Column B],
    t.c AS [Column C],
    (t.a - t.b - t.c) AS [Column D],
    CASE
      WHEN (t.a - t.b - t.c) = 0 THEN 'Equals'
      WHEN (t.a - t.b - t.c) > 0 THEN 'Greater'
      WHEN (t.a - t.b - t.c) < 0 THEN 'Less'
    END AS [Status]          

FROM
    Table1 AS t;

(t.a - t.b - t.c)放入一个变量中,这样我就可以在它出现的所有地方重复使用它,因为该表达式可能随时间而变化。 但我无法在不显著改变现有查询的情况下完成此操作。

3个回答

5

使用 Cross Apply

SELECT
    t.a AS [Column A], 
    t.b AS [Column B],
    t.c AS [Column C],
    [Column D],
    CASE
      WHEN [Column D] = 0 THEN 'Equals'
      WHEN [Column D] > 0 THEN 'Greater'
      WHEN [Column D] < 0 THEN 'Less'
    END AS [Status]          

FROM
    Table1 AS t
    CROSS APPLY (SELECT t.a - t.b - t.c AS [Column D]) AS t2

你需要给交叉应用的“表”命名。 - t-clausen.dk
我需要如何命名交叉应用表? - Felix Brenkel
好的,我会尝试这个解决方案并反馈。 - Felix Brenkel

1
你可以像这样使用 CTE(通用表达式):

您可以使用类似于以下内容的 CTE(通用表达式):

;WITH CTE AS
(
    SELECT
        t.a AS [Column A], 
        t.b AS [Column B],
        t.c AS [Column C],
        (t.a - t.b - t-c) AS [Column D]
    FROM
        Table1 AS t
)
SELECT
    [Column A], 
    [Column B],
    [Column C],
    [Column D],
    CASE
      WHEN [Column D] = 0 THEN 'Equals'
      WHEN [Column D] > 0 THEN 'Greater'
      WHEN [Column D] < 0 THEN 'Less'
    END AS [Status]      
FROM
    CTE

这定义了一个CTE - 类似于“即席”视图 - 你可以使用它来处理计算、聚合等,然后从中选择(或对其使用其他SQL语句)。 CTE仅存在于下一个语句中 - 它不会为多个SQL语句“持久化”。但是它非常方便处理这种情况。

如果他使用SQL Server,那么(t.a - t.b - t.c)表达式只会被计算一次,因此不需要重复计算。查询将执行相同的操作。顺便提一下,你的代码有一个错误。不是(t.a - t.b - t-c),而应该是(t.a - t.b - t.c) - Ionic
@Ionic:是的,它将执行相同的操作 - 但在我看来,使用CTE更易于阅读。 - marc_s
是的,这可能是正确的。但如果以后有更多的连接,可能会更难调试,并且每个开发人员都应该了解什么是CTE。原始查询只是基本的SQL,每个开发人员都应该理解。 :-) - Ionic
使用CTE似乎会复制代码,这样会使代码更难维护。 - Felix Brenkel

-1

我不知道你的问题是什么。但是这里有一些信息可以提供给你。

如果你使用SQL Server,你可以将查询结果赋值给一个变量,像这样:

SELECT @var = value
FROM yourTable

但要注意,如果结果中有多行,则只会将最后一行取到您的变量中。

如果您只是想通过(t.a - t.b - t.c)语句来节省功率,那么这并不必要,因为SQL Server只会评估这些表达式一次,并为每个WHEN进行数据比较,直到找到匹配项。


不,我不想节省电源,我只是想让我的代码更易于维护。 - Felix Brenkel
很简单。我不会使用CTE或其他任何东西。如果你的开发人员经验不够丰富,他们就不知道如何修复其中的错误。而且我认为,由于这个问题,他们并不是所有人都有经验? - Ionic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接