将一列的值用于另一列(SQL Server)?
Posted
技术标签:
【中文标题】将一列的值用于另一列(SQL Server)?【英文标题】:Use value of a column for another column (SQL Server)? 【发布时间】:2011-07-08 01:10:01 【问题描述】:可以说我在某张桌子上有很多选择。一列的一个值是用复数 logc 计算的,它被称为 ColumnA。现在,对于另一列,我需要 ColumnA 中的值并向其添加一些其他静态值。
示例 SQL:
select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...
[ColumnA] + 10 是我正在寻找的。复杂的东西是一个巨大的 case/when 块。
想法?
【问题讨论】:
【参考方案1】:不幸的是,在 SQL Server 2016 中:
SELECT 3 AS a, 6/a AS b;
错误:无效的列名:'a'。
【讨论】:
您可以为此使用 cte: WITH cte AS (SELECT 3 AS a) SELECT a, 6/a AS b FROM cte;【参考方案2】:你可以:
-
在客户端代码中执行
+ 10
编写一个标量值函数来封装complex stuff
的逻辑。它将被优化为一次调用。
为另一列复制complex stuff
逻辑。它应该被优化为 1 次调用。
使用子选择应用附加计算
【讨论】:
【参考方案3】:如果要引用在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 的计算来包含在您的查询中。
【讨论】:
【参考方案4】:您可以使用子查询和列别名来解决这个问题。
这是一个例子:
SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
FROM SomeTable t) As SomeTableMaxId
【讨论】:
以上是关于将一列的值用于另一列(SQL Server)?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:选择一列的计数,同时检查另一列中的不同值