taral
@taral
php программист

Как написать sql между двумя полями типа set?

Допустим у меня есть таблица
id value (type set)
1 a,b
2 r,d,g,h,a
3 g,s,e,a
4 k,l,p,o
И есть набор значений ['a','b','s','u','t']
Мне необходимо с таблицы выбрать те записи где есть хотя бы одно совпадение элемента с моего списка и с списка таблицы.
К примеру в строке 1 элемент 'a' присутствует и в моем списке.
И дополнительная задача. Нужно что бы в моем списке присутствовали все значения с списка строки таблицы. По этому примеру проходит только первая строка где элементы 'a' и 'b' есть в моем списке.
Спасибо за внимание. У меня пока нет идей как это лучше реализовать.
  • Вопрос задан
  • 2210 просмотров
Пригласить эксперта
Ответы на вопрос 1
@SashaSkot
Специалист широкого профиля
ГОСПОДИ! Вы можете русским языком описать задачу?:)
Хранить несколько значений в 1 строке - плохая идея, т.к. для поиска вхождений любого значения ( как я понял - ваш вопрос) нужно разбирать посимвольно хранимую строку и ее сравнивать со множеством. Если бы вы хранили каждый символ отдельно, то искомый запрос выглядел бы так:
SELECT 1 FROM Table as t WHERE t.Value IN ('a','b','s','u','t')

Для твоей задачи нужно написать запрос (функцию, которая будет разбивать строку на символы)
CREATE FUNCTION Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
)

пример запроса
Дальше бегать можно курсором или именными множествами.
На мой взгляд нужно упростить структуру хранения данных, чтобы не городить семиэтажные запросы.
Последний абзац как не пробовал - не получается понять о чем речь :) :)
Ответ написан
Ваш ответ на вопрос

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

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