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
也包含数字1
和2
。
我的问题是我如何选择所有这些行中的数字1
和2
包含在一个字符串中,但不是2-3位数字。我希望它能严格匹配那些1
和2
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 :) –
似乎工作,这项工作,如果我必须搜索2数字?例如,我想查找所有匹配数字1和15的记录。你能解释一下它是如何检索数据的吗?使用concat和instr不知道什么instr – Giorgi
当然它会工作。你可以尝试我为其他例子提供的sqlfiddle链接。 –
您可以使用正则表达式。 [[:<:]]是开始字边界,[[:::]]是结束字边界。
SELECT * FROM MyTable
WHERE My_String RLIKE '[[:<:]]1[[:>:]]'
AND My_String RLIKE '[[:<:]]2[[:>:]]'
所以这将严格匹配数字1和2?所以我会:WHERE My_String RLIKE'[[: Giorgi
在我看来,这可能是做一个或而不是和和? –
这不够好。它会失败,如果“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')
似乎没有任何可以实现的方法。您可能需要更改在该列中存储数据的方式(数据结构)。 – Chibuzo