3

我正在使用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 记录。

所以要问这个问题:为什么有更大的数字会导致这些结果发生变化?如何更改查询以获得预期结果?

4

5 回答 5

6

运算符需要一个字符串作为like左值。根据文档,从floatto的转换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%'
于 2013-06-12T16:12:37.903 回答
2

当您将数字与 LIKE 进行比较时,它会隐式转换为字符串然后匹配
这里的问题是浮点数不精确,转换时您可以获得
13457.6799999999999999 而不是 13457.68

所以要以适当的格式显示这个明确的格式数字(不确定如何在 sql server 中执行此操作,但它会类似于)

SELECT num FROM number_like_test
WHERE Format("0.##",num) LIKE '%68%'
于 2013-06-12T16:01:38.207 回答
2

转换为字符串正在四舍五入您的值。两者都CONVERT具有CAST相同的行为。

SELECT cast(num as nvarchar(50)) as s
FROM number_like_test

或者

SELECT convert(nvarchar(50), num) as s
FROM number_like_test

提供结果:

1234.56
3457.68
13457.7
1234.76
23456.8

您必须使用STR函数和正确的格式参数来尝试获得结果。例如,

SELECT STR(num, 10, 2) as s
FROM number_like_test

给出:

   1234.56
   3457.68
  13457.68
   1234.76
  23456.78
于 2013-06-12T16:03:42.373 回答
2

已经很好地解决了,但是您只需要 CAST 一次,而不是像其他答案建议的那样两次, LIKE 负责字符串转换:

SELECT *
FROM number_like_test
WHERE CAST(num AS DECIMAL(12,6)) LIKE '%68%'

这是一个显示舍入行为的 SQL Fiddle:SQL Fiddle

于 2013-06-12T16:09:09.023 回答
1

这可能是因为 FLOAT 数据类型表示一个浮点数,它是该数字的近似值,不应依赖于精确比较。

如果您需要进行包含浮点值的搜索,则需要将其存储为十进制数据类型(它将保存确切的数字)或使用类似STR() 函数的方法将其转换为 varchar

于 2013-06-12T16:01:34.830 回答