如何基于列中逗号分隔的值进行选择

4szc88ey  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(431)

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

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

或包含多个值

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

什么是正确的查询?

dkqlctbz

dkqlctbz1#

你可以用 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,%'
a1o7rhls

a1o7rhls2#

您可以使用内置 find_in_set 功能。

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

ht4b089n3#

这可以使用mysql正则表达式函数regexp\u来完成,例如:

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*($|,)' )

相关问题