SQL Как отображать поля только из списка чисел

У меня есть таблица элементов, каждый из которых имеет идентификатор элемента (int). Я хочу отображать только элементы с идентификаторами элементов на основе строки. Например, я хочу отобразить элементы «12, 1005, 2». Эта строка каждый раз разная. Как бы я это сделал?


person Kevin    schedule 20.08.2014    source источник
comment
Итак, содержит ли строка целые числа, разделенные запятыми, и вы хотите найти все записи с этими идентификаторами?   -  person Tim Schmelter    schedule 20.08.2014
comment
Ага, это точно.   -  person Kevin    schedule 20.08.2014
comment
Какую СУБД вы используете? Постгрес? Оракул?   -  person a_horse_with_no_name    schedule 20.08.2014
comment
если он передан в виде строки, вам может потребоваться либо проанализировать в таблице, либо использовать динамический sql   -  person gloomy.penguin    schedule 20.08.2014
comment
Я должен был упомянуть, что это для построителя отчетов Oracle. Строка является параметром пользователя.   -  person Kevin    schedule 20.08.2014
comment
Это распространенная проблема и вопрос (у stackoverflow много связанных вопросов). Посмотрите на это, stackoverflow.com/questions/10353969/. Мне особенно нравится подход Джастина Кейва (который напоминает мне подход Тома Кайта).   -  person Patrick Bacon    schedule 20.08.2014


Ответы (3)


Если вы используете Oracle, вы можете использовать IN:

select from item i where i.id in (12,1005,2)
person AndreDuarte    schedule 20.08.2014
comment
Как бы я использовал строку? Если бы у меня был string a = "12,1005,2", как бы я использовал это в SQL-запросе? - person Kevin; 20.08.2014
comment
Неэлегантным подходом (с точки зрения производительности) может быть '%,'||to_char(i.id)||',%', например ','||'12,1005,2'||',' - person Patrick Bacon; 20.08.2014
comment
Я не знаю, какую проблему вы пытаетесь решить, но я думаю, что лучше обработать строку в вашем приложении. Можно ли использовать Execute Immediate? Вы можете объединить sql -> select из элемента i, где i.id in ( с вашей строкой, а затем использовать немедленное выполнение для запроса. - person AndreDuarte; 20.08.2014

ваш параметр всегда состоит из 3 чисел или он может отличаться во время выполнения?? если это исправлено, вы можете использовать substr и instr для вырезания

person feno noga    schedule 20.08.2014
comment
Я считаю, что это может быть по-другому во время выполнения. - person Kevin; 20.08.2014

Я бы рассмотрел подход, задокументированный Джастином Кейвом, с вопросом Как выбрать из списка значений в Oracle. Том Кайт документирует аналогичный подход (без регулярных выражений) на своем сайте Ask Tom.

Поскольку вы находитесь в среде Oracle Apps и используете Oracle Reports, я просто приведу пример с использованием таблицы элементов:

with x as
  ( select '12, 1005, 2' str from dual
  )
select *
from inv.mtl_system_items_b item
where item.organization_id =
  &org_id
and item.inventory_item_id in
  (select to_number(regexp_substr(str,'[^,]+',1,level)) element
  from x
    connect by level <= length(regexp_replace(str,'[^,]+')) + 1
  )

Процедурно в отчетах Oracle вы можете создать функцию как программный модуль, который выполняет этот синтаксический анализ этого параметра значения, разделенного запятыми, используя аналогичную логику (опять же, см. Функция списка синтаксического анализа Джастина Кейва (ответ, связанный с вопросом, на который я ссылаюсь выше).

person Patrick Bacon    schedule 20.08.2014