使用列的值为另一列(SQL Server)?

时间:2011-03-03 12:58:05

标签: sql sql-server calculated-columns

假设我在某张桌子上有很大的选择。使用复数logc计算列的一个值,并将其称为 ColumnA 。现在,对于另一列,我需要来自 ColumnA 的值,并为其添加一些其他静态值。

示例SQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...

[ColumnA] + 10 正在寻找。复杂的东西是一个巨大的案例/何时阻止。

想法?

4 个答案:

答案 0 :(得分:18)

如果要引用在SELECT子句中计算的值,则需要将现有查询移动到子SELECT中:

SELECT
    /* Other columns */,
    ColumnA,
    ColumnA + 10 as ColumnB
FROM
(select table.id, table.number, complex stuff [ColumnA].. from table ...
) t

你必须为这个表引入一个别名(在上面的t,在结束括号后),即使你不打算使用它。

(等效 - 假设您使用的是SQL Server 2005或更高版本 - 您可以将现有查询转移到CTE中):

;WITH PartialResults as (
     select table.id, table.number, complex stuff [ColumnA].. from table ...
)
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults
如果你已经完成了多个级别的部分计算,那么CTE往往看起来更干净。如果你现在有一个依赖于ColumnB的计算要包含在你的查询中。

答案 1 :(得分:1)

您可以使用子查询和列别名解决此问题。

以下是一个例子:

SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
      FROM SomeTable t) As SomeTableMaxId

答案 2 :(得分:1)

你可以:

  1. 执行客户端代码中的+ 10
  2. 编写一个标量值函数来封装complex stuff的逻辑。它将被优化为一次通话。
  3. 复制另一列的complex stuff逻辑。它应该优化为1次调用。
  4. 使用子选择来应用其他计算

答案 3 :(得分:0)

不幸的是,在SQL Server 2016中:

SELECT 3 AS a, 6/a AS b;

错误:列名无效:'a'。