在我的表中,该列之一具有逗号分隔的值。我想根据一个或两个值(如果在该列中找到该条目)来选择条目,例如
select * from table where tags contains ('ec2' or 'associate')
或包含多个值
select * from table where tags contains 's3' and 'rds'
什么是正确的查询?
答案 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*($|,)' )