как выбрать на основе значений в столбце через запятую - PullRequest
0 голосов
/ 30 декабря 2018

В моей таблице один из столбцов имеет значения, разделенные запятыми.Я хотел бы выбрать запись на основе одного или двух значений, если она найдена в этом столбце, например

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

или содержит несколько значений

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

Что такое правильный запрос?

enter image description here

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

Вы можете использовать оператор 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,%'
0 голосов
/ 30 декабря 2018

Это можно сделать с помощью функции регулярного выражения 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*($|,)' )
0 голосов
/ 30 декабря 2018

Вы можете использовать встроенную функцию find_in_set.

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