gpt4 book ai didi

sql-order-by - T-SQL 为什么除以零不会在 order by 子句中产生错误

转载 作者:行者123 更新时间:2023-12-04 05:04:31 25 4
gpt4 key购买 nike

我在一个过程中发现了一些我最初认为不正确的陈述,但在测试它们之后我确信它们工作正常。我无法理解的是方式。

我有一个简单的表,其中包含记录 idptsptsOf 列:

DECLARE @DataSource TABLE
(
RecordID TINYINT
,Pts INT
,PtsOf INT
)

INSERT INTO @DataSource
VALUES (1,5,5)
,(1,7,8)
,(1,3,5)
,(2,5,0)

我需要的是使用以下公式计算每条记录的总分:

SUM(pts)/SUM(ptsOf) * 100

因此,上面的语句将产生以下错误,因为对于最后一条记录,我将有 5/0:

Msg 8134, Level 16, State 1, Line 21 Divide by zero error encountered.

但我发现的语句只在 select 子句中检查是否被零除,而在 order by 子句中没有这样的检查:

 SELECT  RecordID
,CAST(CAST(SUM(Pts) AS decimal) / CASE SUM(PtsOf) WHEN 0 THEN NULL ELSE SUM(PtsOf) END * 100 AS decimal(18, 0))
FROM @DataSource
GROUP BY RecordID
ORDER BY RecordID, CAST(CAST(SUM(Pts) AS decimal) / SUM(PtsOf) * 100 AS decimal(18, 0)) ASC

为什么 order by 类中的计算没有产生错误?

下面是完整的例子:

SET NOCOUNT ON
GO

DECLARE @DataSource TABLE
(
RecordID TINYINT
,Pts INT
,PtsOf INT
)

INSERT INTO @DataSource
VALUES (1,5,5)
,(1,7,8)
,(1,3,5)
,(2,5,0)

SELECT RecordID
,CAST(CAST(SUM(Pts) AS decimal) / CASE SUM(PtsOf) WHEN 0 THEN NULL ELSE SUM(PtsOf) END * 100 AS decimal(18, 0))
FROM @DataSource
GROUP BY RecordID
ORDER BY RecordID, CAST(CAST(SUM(Pts) AS decimal) / SUM(PtsOf) * 100 AS decimal(18, 0)) ASC

SET NOCOUNT OFF
GO

最佳答案

我相信在这种特殊情况下,ORDER BY 中的第二个子句被简单地忽略了。毕竟如果你这样做:

DECLARE @t TABLE(i INT PRIMARY KEY, x UNIQUEIDENTIFIER);

INSERT @t VALUES(1,NEWID()),(2,NEWID()),(3,NEWID()),(4,NEWID());

SELECT i, x FROM @t ORDER BY i, x;

x 未在 ORDER BY 中考虑,为什么要考虑? ORDER BY 子句中的第一个实体已经规定了顺序,第二个子句无法更改它。由于您按 RecordID 分组,SQL Server 足够聪明,可以意识到 ORDER BY 中的第一个元素是唯一的,因此不需要考虑第二个.我无法证明这一点,当第二个元素实际上对 SQL Server 来说更清晰时,我可以通过使用常量使其失败,例如:

ORDER BY RecordID, CONVERT(1/0);

但是当 SQL Server 不容易知道该列的输出,并且无论如何它都不能对输出做任何有用的事情时,它会做正确的事(恕我直言)并丢弃表达式而不对其进行全面评估并导致运行时错误。如果您没有首先按保证唯一的列排序,您也可以返回错误:

ORDER BY CAST(CAST(SUM(Pts) AS decimal) / SUM(PtsOf) * 100 AS decimal(18, 0));

关于sql-order-by - T-SQL 为什么除以零不会在 order by 子句中产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15706833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com