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
类型。
我有一个比较奇怪的现象。
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
类型。