0

假设我的表列包含以下 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%'

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

它选择第二行,因为 numbers21, 25, 32, 112, 212, 311还包含 number12

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

4

3 回答 3

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;
于 2012-11-24T19:57:09.037 回答
1

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

SELECT * FROM MyTable
WHERE My_String RLIKE '[[:<:]]1[[:>:]]'
AND   My_String RLIKE '[[:<:]]2[[:>:]]'
于 2012-11-24T19:30:06.573 回答
0

你有几个选择:

1-如主帖评论中所述,更改结构并且不存储连接字符串

2-编写一个拆分字符串的函数,并检查拆分后数字1和2是否出现在标记中。

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

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')
于 2012-11-24T19:57:23.857 回答