Я хотел бы написать простой оператор Oracle SQL 10g для сравнения элементов (строк) в произвольно определенном запятой, поле, содержащее список разделенных запятыми строк. Элементы в определенном списке могут отображаться в поле в любом порядке, и должны быть найдены точные соответствия (а не подстроки).Сравните элементы в списке, разделенном запятыми, на другой набор элементов в разделенном запятой списке, используя ограниченный Oracle SQL
У меня есть рабочее решение, использующее ряд операторов regexp_like(), введенных вручную, но мне нужно передать это клиенту, который будет поддерживать это перемещение вперед, и хотел бы иметь возможность просто обновлять разделенные запятыми строка напрямую.
У меня также есть некоторые ограничения на основе GUI на основе того, что я могу сделать с Oracle SQL, чтобы выполнить это. В частности, я не могу использовать PL/SQL, и это должно быть записано в одном операторе select (без временных таблиц или чего-нибудь интересного/полезного.) Я нашел несколько решений для того, что я пытаюсь выполнить, но почти все зависело от возможности писать пользовательские функции.
Итак, теперь, когда предыстория/ограничения в стороне, давайте перейдем к ничтожному gritty.
Пример произвольный список (клиент дополнительно): Itema, ItemB, ItemC
Таблица ПОЗИЦИИ:
Колонка товары (VARCHAR2 некоторой произвольной, но достаточной длины)
- Itema, ItemB, ItemC
- ItemC, ItemB, Itema
- ItemX, ItemC, ItemY, Itema, ItemB, ItemB
- ItemX, ItemY, ItemC
Мне нужен один оператор select, который будет в основном выбирать все строки, в которых элементы содержат «ItemA» и «ItemB» и «ItemC», но без необходимости прерывать эту строку вручную. В этом случае он будет соответствовать первой, второй и третьей строкам, но не четвертой строке.
(EDIT) Я понимаю, что эта структура таблицы плохо разработана. В настоящее время я не знаю, можем ли мы вернуться к клиенту, чтобы исправить это, поскольку данные могут быть использованы, как и в других местах, что делает редизайн дорогостоящим и трудоемким. Я уверен, что многие из вас привыкли к этому сценарию. Первоначальная система была разработана плохо, теперь меня привели, чтобы посоветоваться с трудностями, связанными с плохим дизайном. Предположим, что нормализовать эту таблицу невозможно, и ее необходимо использовать как есть.
Вполне возможно, что то, что я хотел бы сделать, просто невозможно, учитывая ограничения интерфейса, которые мне нужны для использования, но мои знания SQL недостаточно велики, чтобы определить это.
Спасибо всем, что нашли время, чтобы прочитать этот вопрос. Пожалуйста, дайте мне знать, если что-то вводит в заблуждение или нуждается в расширении или разъяснении.
Вы не должны хранить значения, разделенные запятой, в одном столбце в первую очередь. Можете ли вы исправить вашу модель данных? –
«НОРМАЛИЗАЦИЯ», основной принцип «Реляционная модель данных». Сначала прочтите об этом. Ваш дизайн испорчен. Способ отображения данных НЕ является тем, как вы храните его в базе данных. –
Извините, я должен был упомянуть, что это плохо спроектировано. Я только недавно был привлечен, чтобы помочь этому клиенту. Я добавил изменение, явно признающее, что это почти полностью проблема из-за плохого дизайна. В настоящее время я не знаю, можно ли нормализовать эту таблицу из-за времени/стоимости. – Strahn