当前位置: 首页 > 面试题库 >

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

余铭晨
2023-03-14
问题内容

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记录。

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


问题答案:

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%'


 类似资料:
  • 问题内容: 是否可以在一个查询中将多个SQL LIKE通配符串在一起-像这样? 目的是查找同时包含通配符但没有特定顺序的记录。 问题答案: 正确的SQL语法是:

  • 我在PostgresQL中有一个表feed_item_likes_dislikes(feed_item_id,user_id,vote),其中 feed_item_id是uuid 用户id为整数 投票=正确那么这是一个类似 投票=FALSE那么这是一种厌恶 vote=NULL表示用户最初喜欢或不喜欢,但通过取消通知返回并删除了投票 我还有另一个表feed_item_likes_dislikes_a

  • 喜欢资讯 取消喜欢资讯 资讯喜欢列表 喜欢资讯 POST /news/{news}/likes Response Headers Status: 201 Created 取消喜欢资讯 DELETE /news/{news}/likes Response Headers Status: 204 No Content 资讯喜欢列表 GET /news/{news}/likes Respons

  • 点喜欢 取消喜欢 喜欢的人列表 点喜欢 POST /feeds/:feed/like Response Status: 201 Created { "message": [ "操作成功" ] } 通知类型 { "channel": "feed:digg", // 通知关键字 "target": 325, // 动态id "content": "@2222 点喜欢了

  • GET /user/likes Parameters 名称 类型 描述 limit Integer 获取条数,默认 20 after Integer 获取之后数据,默认 0 Response Status: 20 OK [ { "id": 2, // 点赞标识 "user_id": 1, // 点赞用户 "target_user": 1, // 接收用户(你能收到就