gpt4 book ai didi

sql - 意外的 SQL 除法结果?

转载 作者:行者123 更新时间:2023-12-02 08:11:54 24 4
gpt4 key购买 nike

我使用 SQL Server。

与部门合作,我在这两个查询中收集了我的发现,您可以使用您的 SQL Server 版本重现这些查询。

我期望 Division with Integer 在这两种情况下具有相同的值。因为无论我的表中的值如何,如果我得到意想不到的结果,我最终会遇到一个逻辑错误,有时很难调查。

SQL A:

WITH s AS (
SELECT 'Integer' AS c, 1 AS k UNION
SELECT 'Float', 1 UNION
SELECT 'NULL', NULL
)
SELECT
c AS [Type],
k/10 AS 'Division',
CAST(k as numeric(38,4))/10 AS 'Cast',
COALESCE(k, 0)/10 AS 'Coalesce',
COALESCE(k, .0)/10 AS 'Coalesce with float'
FROM s;

结果A

Type        Division    Cast        Coalesce    Coalesce with float
Float 0 0.100000 0 0.100000
Integer 0 0.100000 0 0.100000
NULL NULL NULL 0 0.000000

SQL B:

WITH s AS (
SELECT 'Integer' AS c, 1 AS k UNION
SELECT 'Float', .1 UNION
SELECT 'NULL', NULL
)
SELECT
c AS [Type],
k/10 AS 'Division',
CAST(k as numeric(38,4))/10 AS 'Cast',
COALESCE(k, 0)/10 AS 'Coalesce',
COALESCE(k, .0)/10 AS 'Coalesce with float'
FROM s;

结果A

Type        Division    Cast        Coalesce    Coalesce with float
Float 0.010000 0.010000 0.010000 0.010000
Integer 0.100000 0.100000 0.100000 0.100000
NULL NULL NULL 0.000000 0.000000

最佳答案

您的第一个表格全是整数。

SELECT 'Float', 1 is an INT 不是 float 只是因为你把这个词放在那里。它将隐含为 INT,因为没有小数位。

然后,您知道整数除法使用整数...例如...

select 3/10 是 0,而不是 select 3/10.0 会得到的 .3000。如果要返回小数/ float ,则分子或分母需要是 float (或两者都是)

编辑

在你最后的评论之后,我对你的问题有了更多的理解。当您将不同的数据类型合并在一起时(您在第二个 CTE 中所做的),SQL Server 将隐式地将它们转换为必要的数据类型以伴随所有输入。 See the order of precedence here

因此,如果您只是从那个 cte 中选择 *... 您将看到您的 1 已转换为 1.0。一个列只能有一个数据类型。在此示例中,SQL Server 必须选择 INTFLOAT。如果选择 INT,您将遇到数据完整性问题。

WITH s AS (
SELECT 'Integer' AS c, 1 AS k UNION
SELECT 'Float', .1 UNION
SELECT 'NULL', NULL
)

select * from s

关于sql - 意外的 SQL 除法结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46062130/

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