我理解比较 float 时遇到的许多问题,并对它们在这种情况下的使用感到遗憾 - 但我不是表格作者,只有一个小障碍需要克服......
有人决定使用 float ,就像您期望使用 GUID 一样。我需要检索具有特定浮点值的所有记录。
sp_help MyTable
-- Column_name Type Computed Length Prec
-- RandomGrouping float no 8 53
这是我天真的尝试:
--yields no results
SELECT RandomGrouping
FROM MyTable
WHERE RandomGrouping = 0.867153569942739
这是一个大概的工作尝试:
--yields 2 records
SELECT RandomGrouping
FROM MyTable
WHERE RandomGrouping BETWEEN 0.867153569942739 - 0.00000001
AND 0.867153569942739 + 0.00000001
-- 0.867153569942739
-- 0.867153569942739
在我天真的尝试中,该文字是浮点文字吗?或者它真的是稍后转换的十进制文字吗?
如果我的文字不是浮点文字,那么制作浮点文字的语法是什么?
编辑:我想到了另一种可能性...可能是此列中存储了比显示的更精确的数字。创建代表该数字的文字可能是不可能的。我会接受证明情况确实如此的答案。
<小时/>编辑:对 DVK 的回复。
TSQL 是 MSSQLServer 的 SQL 方言。
此脚本有效,因此可以在浮点类型之间确定性地执行相等性:
DECLARE @X float
SELECT top 1 @X = RandomGrouping
FROM MyTable
WHERE RandomGrouping BETWEEN 0.839110948199148 - 0.000000000001
AND 0.839110948199148 + 0.000000000001
--yields two records
SELECT *
FROM MyTable
WHERE RandomGrouping = @X
我说“大约”是因为该方法测试一个范围。使用该方法,我可以获得不等于我的预期值的值。
链接的文章不适用,因为我没有(故意)尝试跨越十进制和浮点之间的世界界限。我正在尝试仅使用 float 。这与小数与 float 的不可转换无关。
<小时/>对 Zinglon 的回应:
可以找到我的记录的字面值,谢谢。
DECLARE @Y binary(8)
SET @Y = 0x3FEAD9FF34076378
SELECT *
FROM MyTable
WHERE convert(binary(8), RandomGrouping) = @Y
最佳答案
is that literal a floating point literal? Or is it really a decimal literal that gets converted later?
If my literal is not a floating point literal, what is the syntax for making a floating point literal?
SQL Server 中的0.867153569942739
文字是decimal
类型,而不是float
。
引擎自动选择适当的比例和精度来表示给定的文字。
要编写 float
类型的文字,您应该使用科学计数法,如下所示:
0.867153569942739E0
decimal constants
decimal constants are represented by a string of numbers that are not enclosed in quotation marks and contain a decimal point. The following are examples of decimal constants:
1894.1204 2.0
float and real constants
float and real constants are represented by using scientific notation. The following are examples of float or real values:
101.5E5 0.5E-2
sp_describe_first_result_set
可以告诉我们列的类型
EXEC sp_describe_first_result_set N'SELECT 0.867153569942739, 0.867153569942739E0'
它返回第一列的 numeric(15,15)
和第二列的 float
。
如果您的列 RandomGrouping
已建立索引,则使用 float
文字会更有效,因为当您将 RandomGrouping
包装在 convert()
,不能使用索引。
以下查询将使用索引:
SELECT *
FROM MyTable
WHERE RandomGrouping = 0.867153569942739E0
以下查询将不使用索引:
SELECT *
FROM MyTable
WHERE convert(binary(8), RandomGrouping) = @Y
关于sql - TSQL - 生成文字浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024306/