小编典典

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

sql

LIKE用来针对浮点型字段返回匹配的数值结果。看来,一旦小数点左边有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记录。

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


阅读 255

收藏
2021-04-14

共1个答案

小编典典

like运营商需要一个字符串作为左边的值。根据文档,从float到的转换varchar可以使用几种样式

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%'
2021-04-14