sql - SQL Server对float字段的“喜欢”产生不一致的结果

标签 sql sql-server tsql

我正在使用LIKE返回针对float字段的匹配数字结果。似乎一旦小数点左边有4位以上的数字,则不会返回与我的小数点右边的搜索项匹配的值。这是说明情况的示例:

CREATE TABLE number_like_test (
  num [FLOAT] NULL
)

INSERT INTO number_like_test (num) VALUES (1234.56)
INSERT INTO number_like_test (num) VALUES (3457.68)
INSERT INTO number_like_test (num) VALUES (13457.68)
INSERT INTO number_like_test (num) VALUES (1234.76)
INSERT INTO number_like_test (num) VALUES (23456.78)

SELECT num FROM number_like_test
WHERE num LIKE '%68%'


该查询不会返回值为12357.68的记录,但会返回值为3457.68的记录。同样使用78(而不是68)运行查询不会返回23456.78记录,但是使用76将返回1234.76记录。

因此要提出一个问题:为什么数量更大会导致这些结果发生变化?如何更改查询以获得预期结果?

最佳答案

like运算符需要一个字符串作为左值。根据文档,从floatvarchar的转换可以使用several styles

Value         Output
0 (default)   A maximum of 6 digits. Use in scientific notation, when appropriate.
1             Always 8 digits. Always use in scientific notation.
2             Always 16 digits. Always use in scientific notation.


默认样式适用于3457.68中的六位数,但不适用于13457.68中的七位数。要使用16位数字代替6位数字,可以使用convert并指定样式2。样式2表示一个类似于3.457680000000000e+003的数字。但这不适用于前两位数字,并且您免费获得了意外的+003指数。

最好的方法可能是从floatdecimal的转换。该转换使您可以指定比例和精度。使用标度20和精度10,浮点数表示为3457.6800000000

where   convert(decimal(20,10), num) like '%68%'

关于sql - SQL Server对float字段的“喜欢”产生不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069895/

相关文章:

sql - 无法在查询中从 TextBox 进行部分匹配

Java执行多条SQL语句并写入excel

sql - 如何将 SQL Server 数据库中的所有日期时间记录更新为 UTC 时间?

SQL - 如何通过 TSQL 查找当前正在运行的作业步骤

php - mysql用循环计数行

sql - 如何更新 postgres 中时间戳字段的一部分?

Java - 检查 SqlSessionFactory 是否有效

sql-server - 如何保持 Redis 数据与 SQL Server 中的数据准确

sql - 查找包含开始日期和结束日期的记录未涵盖的时间间隙

sql-server - TSQL 四舍五入到半位小数