【问题标题】:Mysql select all that match a number in stringMysql选择所有匹配字符串中的数字
【发布时间】:2012-11-24 19:22:19
【问题描述】:

假设我的表格列包含以下 2 个字符串行:

       1, 5, 2, 31, 12, 1212, 111
       21, 25, 32, 43, 112, 212, 311

我需要一个查询来选择包含数字 1 并包含数字 2 的行

我的查询是:

      SELECT *
      FROM MyTable
      WHERE My_String LIKE '%1%' AND My_String LIKE '%2%'

现在,当我希望它只返回第一行时,它会返回两行。

它选择第二行,因为数字 21, 25, 32, 112, 212, 311 还包含数字 12

我的问题是如何选择所有那些数字 12 包含在字符串中但不包含在 2-3 位数字中的行。我希望它与12 严格匹配

【问题讨论】:

  • 似乎没有任何确定的方法可以实现这一目标。您可能需要更改在该列中存储数据的方式(数据结构)。

标签: mysql sql database wildcard


【解决方案1】:

http://www.sqlfiddle.com/#!2/b082d/5

select * from testtable
where instr(concat(', ', longstring, ', '), ', 2,') >0;

select * from testtable
where instr(concat(', ', longstring, ', '), ', 1,') >0 
and  instr(concat(', ', longstring, ', '), ', 2,') >0;

【讨论】:

  • +1 我喜欢这个主意。与我在答案中写的相比,它节省了很多比较。我只想指出,由于要求同时出现数字 1 和 2,因此您可以为数字 1 添加具有类似行为的 and 条件:)
  • 似乎有效,如果我必须搜索 2 位数字,这是否也有效?例如,我想查找与数字 1 和 15 匹配的所有记录。您能否解释一下它是如何检索数据的?使用 concat 和 instr 不知道 instr 是做什么的
  • 当然可以。您可以尝试我为其他示例提供的 sqlfiddle 链接。
  • 如果你有时间,你能解释一下它的工作原理是什么样的魔法查询吗?
  • 这真的不难,使用 concat 方法它只是在所有行的开头和结尾添加“,”。比你的字符串变成“, 1, 5, 2, 31, 12, 1212, 111,”。因此,您始终可以启用像“,1”这样的搜索。如果我们没有在字符串的开头和结尾添加“,”,您将无法搜索第一项和最后一项。
【解决方案2】:

您可以使用正则表达式。 [[:<:>:]] 是结束词边界。

SELECT * FROM MyTable
WHERE My_String RLIKE '[[:<:]]1[[:>:]]'
AND   My_String RLIKE '[[:<:]]2[[:>:]]'

【讨论】:

  • 所以这将严格匹配数字 1 和 2?所以我会有: WHERE My_String RLIKE '[[:<: and my_string rlike>
  • 在我看来,这可能是在做 OR 而不是 AND ?
  • 这还不够好。如果“1”或“2”是最后一个数字,那么它将失败,因此后面没有昏迷。如果列表仅包含 1 或仅包含 2,则相同。您的解决方案必须涵盖所有出现的可能性:1-开始,2-中间,3-结束 4-唯一元素。
  • 逗号也算作单词边界,因此 '[[:<:>:]]' 将与逗号无关。我没有意识到两者都必须是真的,我认为这是非此即彼的。 TBH,表中以逗号分隔的字符串列表表明此类信息应存储在单独的表中,字符串中的每个值都保存为一行并与特定的记录索引相关联。然后选择变得微不足道。
【解决方案3】:

你有几个选择:

1- 如主帖评论中所述,更改结构,不要存储串联字符串

2-编写一个函数,对字符串进行拆分,并检查拆分后数字1和2是否出现在token中。

3- 编写“where”子句来捕捉字符串出现的每一种可能性: 字符串可以出现在列表的开头、中间、结尾,也可以是列表中的唯一元素。最后一个并不重要,因为您需要 1 和 2 连续出现,因此应该消除包含单个元素的列表 String 。所以:

select *
from MyTable
where (My_String like '1,%'  or My_String like '%, 1,%' or My_String like '%, 1') 
and (My_String like '2,%'  or My_String like '%, 2,%' or My_String like '%, 2')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多