SQL Как из перечня свойств выбрать строки по двум совпавшим?

Приветствую.
В таблице есть текстовое поле с перечнем свойств ч/з разделитель:
parameters: "PARAM1 PARAM2 ... PARAMn".
Для поиска предлагается так же перечень:
find: "PARAMa ... PARAMx".
Надо из таблицы выбрать строки, чтоб совпали минимум две параметра.
Пример: "PARAM1 PARAM2 PARAM5" и "PARAM1 PARAM3 PARAM5 PARAM6" - условие выполнено.
Благодарю.
  • Вопрос задан
  • 278 просмотров
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Нормализацию данных не предлагать?
Ответ написан
erge
@erge
Примус починяю
Т.к. СУБД не указана, то в целом решение примерно такое
  1. либо - искомую строку разбиваем на строки (в таблицу) объединяем с исходной таблицей и ищем вхождение каждого параметра (из "разбитой" в таблицу строки) через функцию поиска подстроки, далее группируем и применяем HAVING count(1) >= 2
  2. либо наоборот - каждую строку параметров исходной таблицы разбиваем получаем таблицу матрицу параметров, далее ищем вхождение параметров в искомой строке, и так же группируем и применяем HAVING count(1) >= 2

надеюсь понятно изложил...

и опять таки , т.к. СУБД не указана, то применительно к MS SQL это будет выглядеть вот так:

1.
WITH f AS (
  SELECT 'PARAM1 PARAM3 PARAM7' as findstr
),
fr AS (
  SELECT t.value AS param
    FROM f
    CROSS APPLY STRING_SPLIT(f.findstr, ' ') t
)
SELECT d.id, count(1) AS num_matches
  FROM data d
  CROSS JOIN fr
  WHERE charindex(fr.param, d.parameters) > 0
  GROUP BY id
  HAVING count(1) >= 2
;


2.
WITH f AS (
  SELECT 'PARAM1 PARAM3 PARAM7' as findstr
)
SELECT d.id, count(1) AS num_matches
  FROM data d
  CROSS APPLY STRING_SPLIT(d.parameters, ' ') ds
  JOIN f ON 1=1
  WHERE charindex(ds.value, f.findstr) > 0
  GROUP BY d.id
  HAVING count(1) >= 2
;


см. пример на dbfiddle

PS: относительно других СУБД все примерно так же + - , синтаксис другой может быть и наличие аналога функции STRING_SPLIT
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы