Sql Un-Wizardry: сравнивать значения из одного списка в другом - PullRequest
1 голос
/ 05 мая 2009

У меня есть сравнение, которое я хотел бы сделать более эффективным в SQL.

Поле ввода (fldInputField) представляет собой разделенный запятыми список «1,3,4,5»

База данных имеет поле (fldRoleList), которое содержит «1,2,3,4,5,6,7,8»

Итак, для первого вхождения fldInputField в fldRoleList, сообщите нам, какое это было значение.

Есть ли способ достичь следующего в MySQL или хранимой процедуре?

псевдокод

ВЫБРАТЬ * ОТ таблицы t1 ГДЕ fldInputField в t1.fldRoleList

/ псевдокод

Я предполагаю, что могут быть некоторые функции, которые лучше всего подходят для этого типа сравнения? Я ничего не мог найти в поиске, если кто-то может направить меня, я удалю вопрос ... Спасибо!

ОБНОВЛЕНИЕ: Это не идеальный (или хороший) способ сделать что-то. Это унаследованный код, и мы просто пытаемся внести быстрое исправление, пока мы смотрим на построение логики, чтобы справиться с этим с помощью нормализованных строк. К счастью, это не сильно используемый код.

Ответы [ 2 ]

3 голосов
/ 05 мая 2009

Я согласен с ответом @Ken White, что списки, разделенные запятыми, не имеют места в нормализованном дизайне базы данных.

Решение будет проще и будут работать лучше, если вы сохраните fldRoleList как несколько строк в зависимой таблице:

SELECT t1.*, r1.fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField);

(см. Функцию MySQL FIND_IN_SET())

Но это выводит несколько строк, если несколько ролей соответствуют разделенной запятыми входной строке. Если вам нужно ограничить результат одной строкой для каждой записи aTable с соответствующей ролью first :

SELECT t1.*, MIN(r1.fldRole) AS First_fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField);
GROUP BY t1.aTable_id;
2 голосов
/ 05 мая 2009

У вас ужасный дизайн схемы, вы знаете. Списки, разделенные запятыми, не имеют никакого отношения к БД.

Это, как говорится ... Вы ищете, как.

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE fldInputField + '%'

Если содержимое может не всегда совпадать в начале, добавьте еще один знак процента перед fldInputField.

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE '%' + fldInputField + '%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...