【问题标题】:where clause to get records which matches upto 2 decimalwhere 子句获取匹配最多 2 个小数的记录
【发布时间】:2021-09-27 22:59:57
【问题描述】:

我的表格包含以下值: 名称: 28.54617, 28.54917, 98.54617, 48.54217, 28.54217

如何在 where 子句中写入条件以获取所有匹配到小数点后两位的记录 所以这里的预期输出是: 28.54617,28.54917,28.54217

我想要与这个 where 子句匹配的所有行,如果我执行 'colName' = '28.54617',它只会返回 1 行,因为它会精确匹配浮点数,而不是我想要匹配最多 2 的所有行输入值的小数。在这种情况下,输入值为 28.54617。谢谢

【问题讨论】:

  • 2 种方法:算术,|lookup - colname[i]| <= 0.01。这将接近 OP 的目标。 文本执行|lookup - colname[i]| <= 0.02(过滤掉远处的)和文本(保留2位小数)比较。
  • 数据必须截断,不能四舍五入? 28.54999和28.55000不在一个组里?
  • 截断很好,应该只比较前两位小数,如果匹配应该是查询结果的一部分。
  • "所有匹配的记录" -- 匹配什么?匹配“28.54”?互相匹配?

标签: mysql sql floating-point decimal where-clause


【解决方案1】:

使用函数TRUNCATE():

SELECT *
FROM tablename
WHERE TRUNCATE(col, 2) = 28.54

或者,如果您的输入是像28.54617 这样的数字:

SELECT *
FROM tablename
WHERE TRUNCATE(col, 2) = TRUNCATE(28.54617, 2)

将col 更改为您的专栏名称。

【讨论】:

    【解决方案2】:

    如果我没记错的话,您需要在小数点之前在表格中重复多次的列。

    floor() 函数小数点前的部分给出数字。

    select t2.val
    from
      (select floor(val) as val
      from numTable
      group by floor(val)
      Having count(*) > 1) t1 join numTable t2 on t1.val = floor(t2.val)
    

    db<>fiddle中的演示

    【讨论】:

    • 我想要与此 where 子句匹配的所有行,如果我执行 'colName' = '28.54617',它将只返回 1 行,因为它将完全匹配浮点数,而不是我想要所有行匹配输入值的最多 2 位小数。在这种情况下,输入值为 28.54617。谢谢
    • 还是不明白能不能输入数据表和想要的输出?
    猜你喜欢
    • 2015-10-14
    • 2014-07-11
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多