sql - TSQL - 生成文字浮点值

标签 sql sql-server tsql floating-point literals

我理解比较 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

这记录在Constants (Transact-SQL)

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/

相关文章:

sql - Pl/SQL- 从查询中获取列名

sql - PostgreSQL:删除子查询返回的行

sql - 如何有效地从 View 中的另一个表中查找常量值(仅一次)?

sql-server - 验证 SQL 中的列表输入

sql - 搜索表 - 如果找到结果,则不要搜索下一个表

sql - 在 SQL 中,如何在 nvarchar 中每 2 个空格插入一个字符?

python - Superset 无法连接到我的 MSSQL 数据库

c# - 在 MVC 中显示数据库中的图像

sql-server - DBCC 收缩文件给出错误

sql - SQL 2005 中的 TSQL : Query