首页 > 解决方案 > 当 SQL 中的两个值具有不同的数据类型时,如何将它们与给定的十进制精度进行比较?

问题描述

我试图证明使用 EXCEPT 查询的两个表之间没有显着差异。我只包括我关心比较的领域。问题是由于其中一个表具有浮点格式的数据而另一个表具有 Decimal(24,7),因此结果集中出现了大量差异。我希望我的 EXCEPT 查询仅包含大于 1 的差异。

我尝试将浮点数转换为 Decimal(24,7) 以及将两者都转换为 Decimal(24,2) 但由于四舍五入,仍然存在差异标记。例如,一个表可能显示 2.55,而另一个表可能显示 2.5499999。这被标记为差异。如果我截断这些值,我仍然会得到差异(2.55 与 2.54)。如果我将它们四舍五入或转换为 Decimal(24,2),则此特定实例是固定的,但会出现其他实例(例如,舍入 2.355 与 2.35499999 会导致 2.36 与 2.35)。

如何转换或舍入十进制值,以使我的 EXCEPT 查询不返回任何小于 1 的差异?

示例代码:

SELECT name, weight FROM Table1

EXCEPT

SELECT name, weight FROM Table2

/* 返回数以千计的差异。如果我将两个权重都转换为 Decimal(24,2) 我得到的差异要少得多,但我只想显示大于 1 的差异。*/

标签: sqlcomparisondecimalprecision

解决方案


这可能不适合EXCEPT. 但是您可以尝试使用较少的小数位数:

SELECT name, CAST(weight as DECIMAL(24, 3)) FROM Table1
EXCEPT
SELECT name, CAST(weight as DECIMAL(24, 3)) FROM Table2;

或者,您可以使用NOT EXISTS

SELECT name, weight
FROM Table1 t1
WHERE NOT EXISTS (SELECT 1
                  FROM table2 t2
                  WHERE t2.name = t1.name AND
                        ABS(t2.weight - t1.weight) < 0.00001
                 );

推荐阅读