【问题标题】:How to compare numeric values with comma separated with the SQL Query如何比较用 SQL 查询分隔的逗号的数值
【发布时间】:2018-08-30 14:15:01
【问题描述】:

考虑将结果值存储在单列字段中的表,其中三个记录的数据类型定义为如下所示的 Varchar

  1. 12.2958104,12.0769
  2. 12.9715987,12.1053
  3. 12.5358104,12.07

参考上表的三条记录。我们需要比较一定范围内的纬度值

SELECT * FROM `table_name` WHERE lat >= 12.07 and lat <= 12.53

实际输出:

  • 12.2958104,12.0769

预期输出:

  • 12.2958104,12.0769
  • 12.5358104,12.07

逗号分隔后不考虑后续值

即,为了执行任何其他操作。它只接受逗号前面的值,但不接受后面的值。为什么不与第二条记录字段中的值 12.07 进行比较?
自 12.1053 起大于 12.07。

应该如何比较用逗号分隔的值?


一般来说,我们如何比较用逗号分隔的值
例如:
  • 1.5,2.0,2.5,3.0
  • 3.5,4.0,4.5,5.0
  • 6.0,6.5.0,7.0,7.5
  • 8.0,8.5,9.0

对于值 =5.0

应选择预期结果为

  • 3.5,4.0,4.5,5.0
  • 6.0,6.5.0,7.0,7.5

但实际出现的结果是:

  • 6.0,6.5.0,7.0,7.5

【问题讨论】:

  • 我认为您在查询中打错字了,似乎您的意思是第二个 lat 应该很长
  • @RickRongen 不。我只考虑用逗号分隔的纬度值。但我的经度值与不同的值分开
  • 如果您的值存储为字符串/varchars,请查看 Gordon 的答案。否则我不明白你的数据结构,你能指定table_name中的列及其各自的数据类型吗?

标签: mysql sql comma


【解决方案1】:

这回答了问题的原始版本。

使用substring_index():

SELECT *
FROM `table_name`
WHERE (substring_index(lat, ',', 1) + 0 > 12.07 AND
       substring_index(lat, ',', 1) + 0 < 12.53
      ) OR
      (substring_index(lat, ',', -1) + 0 > 12.07 AND
       substring_index(lat, ',', -1) + 0 < 12.53
      );

为什么您的版本不起作用?因为您使用的是 BOGUS 数据格式。您不应该将值存储在分隔字符串中。以下是一些原因:

  • 数字不应存储为字符串。
  • SQL 的字符串解析能力很差。
  • 不应将多个值存储在单个列中。
  • SQL 具有这些用于存储单个值的出色结构。它们被称为“列”和“表”。使用它们!

【讨论】:

  • 你会尝试回答编辑后的帖子吗? @戈登林诺夫
  • 不使用 substring_index() 你能回答同样的问题吗? @戈登林诺夫
  • 我们应该如何解决 Eg 问题@Gordon Linoff
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 2014-05-15
相关资源
最近更新 更多