如何根据列中的逗号分隔值进行选择

时间:2018-12-29 23:44:40

标签: mysql select tags comma

在我的表中,该列之一具有逗号分隔的值。我想根据一个或两个值(如果在该列中找到该条目)来选择条目,例如

select * from table where tags contains ('ec2' or 'associate')

或包含多个值

select * from table where tags contains 's3' and 'rds'

什么是正确的查询?

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以使用内置的find_in_set函数。

find_in_set('s3',tags) > 0 and find_in_set('rds',tags) > 0

答案 1 :(得分:0)

您可以使用like运算符:

select * from table 
where 
  concat(',', tags, ',') like '%,s3,%' 
  and
  concat(',', tags, ',') like '%,rds,%'

如果在tags之后的,中有一个空格,则:

select * from table 
where 
  concat(', ', tags, ',') like '%, s3,%' 
  and
  concat(', ', tags, ',') like '%, rds,%'

答案 2 :(得分:0)

这可以使用mysql正则表达式函数REGEXP_LIKE完成:

REGEXP_LIKE(tags, '(^|,)\s*ec2\s*($|,)' )
AND REGEXP_LIKE(tags, '(^|,)\s*associate\s*($|,)' )

由于它不需要修改比较值,因此它的性能可能优于使用LIKE的解决方案。

正则表达式说明:

  • (^|,):字符串开头或逗号
  • \s*:0个或更多连续空格
  • ec2:要搜索的字符串
  • \s*:0个或更多连续空格
  • ($|,):字符串或逗号的结尾

如果您希望使用OR过滤器而不是AND,则可以在单个函数调用中表示它,例如:

REGEXP_LIKE(tags, '(^|,)\s*((ec2)|(associate))\s*($|,)' )