SQL Where Condition 无法找到它在不使用 subselect 或变量时找到的数据

SQL Where Condition fails to find data which it finds when not using subselect or variable

我有一个比较奇怪的现象。

DECLARE @SearchLE float
DECLARE @CompareLE float

SET @SearchLE = 
(
SELECT
    LastValue
FROM
    TableA
WHERE
    Articlenumber = 'example'
)

SELECT @SearchLE as SearchValue

returns 66,4 这是正确的。

SET @CompareLE =
(
SELECT TOP 1
            LastValue
        FROM
            TableB
        WHERE
            Articlenumber = 'example'
        AND
            LastValue= 
            --@SearchLE
            66.4
)

SELECT @CompareLE as CompareValue

returns 66,4 这显然也是正确的。

当我取消注释 @SearchLE 并注释掉 66.4 时,第二个 SELECT 语句 returns NULL.

谁能给我解释一下?表中的两种数据类型都是浮点数。

它都在一个 SQL 服务器数据库中,如果这很重要,我使用 SQL Server Management Studio。请注意,我的 return 值是用逗号而不是句点分隔的。

我也试过 TRY_CONVERT 浮动在两个值上,但没有成功。

浮点数是一种近似数据类型,因此将浮点数与浮点数进行比较通常不是一个好主意。如果要比较,请将您的值转换为十进制。如果可能,请更新 table 中的数据类型,否则您必须在查询中对其进行转换,但如果 table.

较大,这可能会导致性能问题

例如

DECLARE @SearchLE decimal (8,2)

...

SET @CompareLE =
(
SELECT TOP 1
            LastValue
        FROM
            TableB
        WHERE
            Articlenumber = 'example'
        AND
            CAST( LastValue as decimal (8,2)) = @SearchLE

)

我不认为从浮点数到数字的转换是可搜索的——这意味着转换会阻止 SQL 服务器使用索引或修剪分区。所以我推荐直接比较:

LastValue > (@SearchLE - 0.0001) and LastValue < (@SearchLE + 0.0001)

这可以使用 LastValue 上的索引。

请注意,这等同于:

ABS(LastValue - @SearchLE) < 0.0001

但这不使用索引。

如果您需要进行此类比较,您可能希望将 LastValue 更改为 decimal/numeric 类型。