在我的表中,其中一列有逗号分隔的值。我想根据一个或两个值来选择条目,如果在该列中找到,比如
select * from table where tags contains ('ec2' or 'associate')
或包含多个值
select * from table where tags contains 's3' and 'rds'
什么是正确的查询?
uurity8g1#
这可以使用mysql正则表达式函数regexp\u来完成,例如:
REGEXP_LIKE(tags, '(^|,)\s*ec2\s*($|,)' ) AND REGEXP_LIKE(tags, '(^|,)\s*associate\s*($|,)' )
因为它不需要修改比较值,所以它的性能可能比使用 LIKE .正则表达式解释: (^|,) :字符串或逗号的开头 \s* :0个或多个连续空格 ec2 :要搜索的字符串 \s* :0个或多个连续空格 ($|,) :字符串或命令的结尾如果你想要 OR 筛选而不是 AND ,它可以表示为单个函数调用,如:
LIKE
(^|,)
\s*
ec2
($|,)
OR
AND
REGEXP_LIKE(tags, '(^|,)\s*((ec2)|(associate))\s*($|,)' )
iibxawm42#
你可以用 like 操作员:
like
select * from table where concat(',', tags, ',') like '%,s3,%' and concat(',', tags, ',') like '%,rds,%'
如果在 tags 每次之后 , 然后有一个空间:
tags
,
select * from table where concat(', ', tags, ',') like '%, s3,%' and concat(', ', tags, ',') like '%, rds,%'
wooyq4lh3#
您可以使用内置 find_in_set 功能。
find_in_set
find_in_set('s3',tags) > 0 and find_in_set('rds',tags) > 0
3条答案
按热度按时间uurity8g1#
这可以使用mysql正则表达式函数regexp\u来完成,例如:
因为它不需要修改比较值,所以它的性能可能比使用
LIKE
.正则表达式解释:
(^|,)
:字符串或逗号的开头\s*
:0个或多个连续空格ec2
:要搜索的字符串\s*
:0个或多个连续空格($|,)
:字符串或命令的结尾如果你想要
OR
筛选而不是AND
,它可以表示为单个函数调用,如:iibxawm42#
你可以用
like
操作员:如果在
tags
每次之后,
然后有一个空间:wooyq4lh3#
您可以使用内置
find_in_set
功能。