Mysql的选择所有匹配的字符串一个数字,

问题描述:

假设我的表列包含以下2个行:Mysql的选择所有匹配的字符串一个数字,

 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

+0

似乎没有任何可以实现的方法。您可能需要更改在该列中存储数据的方式(数据结构)。 – Chibuzo

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; 
+0

+1我喜欢这个主意。与我在答案中写的相比,它节省了许多比较。我只是想指出,因为要求是同时出现数字1和2,您可能会添加一个条件与类似的行为,为数字1 :) –

+0

似乎工作,这项工作,如果我必须搜索2数字?例如,我想查找所有匹配数字1和15的记录。你能解释一下它是如何检索数据的吗?使用concat和instr不知道什么instr – Giorgi

+0

当然它会工作。你可以尝试我为其他例子提供的sqlfiddle链接。 –

您可以使用正则表达式。 [[:<:]]是开始字边界,[[:::]]是结束字边界。

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

所以这将严格匹配数字1和2?所以我会:WHERE My_String RLIKE'[[: Giorgi

+0

在我看来,这可能是做一个或而不是和和? –

+0

这不够好。它会失败,如果“1”或“2”是最后一个号码,因此在它之后没有昏迷。如果列表只包含1个或仅包含2个,则相同。您的解决方案必须覆盖所有可能的外观:1-开始,2-中间,3-末端4-是唯一的元素。 –

您有几种选择:

1作为主信息的评论中提到的,改变结构,不存储连接的字符串

2-编写一个函数来分割字符串,并检查分号后数字1和2是否出现在令牌中。

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