Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Вопрос по фильтрации


Автор: lynx13 22.2.2010, 10:52
Доброе утро!!!

Есть запрос вида:

Select f1, f2,...fn from tab1, tab2..
where ....
and....
.........
union all
Select f1, f2,...fn from tab3, tab2..
where ....
and....
.........
union all
Select f1, f2,...fn from tab4, tab2..
where ....
and....
.........

В программе нужно ввести параметры поиска, например по дате, а за тем передать результат в таблицу..
Как для такого запроса использовать фильтр, чтобы поиск осуществлялся по всем трем частям запоса???

Спасибо!

Автор: pseud 22.2.2010, 12:08
СУБД?

Добавлено через 35 секунд
Используемые компонеты доступа к БД?

Автор: lynx13 22.2.2010, 12:13
oracle, OraQuery , DataSource

Автор: pseud 22.2.2010, 12:22
Цитата(lynx13 @  22.2.2010,  10:52 Найти цитируемый пост)
 а за тем передать результат в таблицу..

в реальную таблицу базы данных?

Добавлено через 2 минуты
фильтровать по дате обязательно после выполнения запроса?
или можно прямо в запросе?

Автор: lynx13 22.2.2010, 12:30
Цитата(pseud @  22.2.2010,  12:22 Найти цитируемый пост)
в реальную таблицу базы данных?

Цитата

Нет отобразить в таблице программы..

Цитата(pseud @  22.2.2010,  12:22 Найти цитируемый пост)
фильтровать по дате обязательно после выполнения запроса?
или можно прямо в запросе? 

Нет запрос выполняется, когда ввели условия поиска


Автор: pseud 22.2.2010, 12:37
Есть ли проблема в реализации такой логики?
Код

Select f1, f2,...fn from tab1, tab2..
where ....
and....
and tab777.date = :p_date1
.........
union all
Select f1, f2,...fn from tab3, tab2..
where ....
and....
and tab777.date = :p_date2
.........
union all
Select f1, f2,...fn from tab4, tab2..
where ....
and....
and tab777.date = :p_date3
.........

Код

for i := 1 to n do
  OraQuery.ParamByName('p_date' + IntToStr(i)).AsDate := DateTimePicker1.Date;

Автор: lynx13 22.2.2010, 12:45
Цитата(pseud @  22.2.2010,  12:37 Найти цитируемый пост)
Есть ли проблема в реализации такой логики?

С этим понятно, что по идее нужно в каждую часть встявлять строку and tab777.date = :p_date3...
но что делать, если этих параметров много и какие-то задаются при поиске, а какие-то нет????

Может как-то можно в sql.text вставить строку and tab777.date = :p_date3 в определенном месте??? например перед(union all), если с фильтром никак...

Автор: pseud 22.2.2010, 12:53
Цитата(lynx13 @  22.2.2010,  12:45 Найти цитируемый пост)
но что делать, если этих параметров много и какие-то задаются при поиске, а какие-то нет????

Есть несколько выходов:
1. если параметр не задан, ты передаешь null, если задан - передаешь значение. Такая конструкция съест оба варианта.
Код

and (<параметр_дата> is null or tab777.date = <параметр_дата>)

2. не совсем понятен твой селект, может его впринципе передалать если все селекты в нем идентичны.
можешь реализовать массив селектов в которые в циклах загонять параметры, а потом их объединять union all в общий селект.

Хотя я рекомендую пересмотртеть подход к селекту. Выкладывай всё. Может там глобально оптимизировать можно.

Автор: Deniz 24.2.2010, 11:52
Цитата(pseud @  22.2.2010,  14:53 Найти цитируемый пост)
Такая конструкция съест оба варианта.
другой вариант конструкции:
Код
and (tab777.date = coalesce(<параметр_дата>, tab777.date))


Добавлено через 2 минуты и 14 секунд
Но все же поддерживаю.
Цитата(pseud @  22.2.2010,  14:53 Найти цитируемый пост)
Хотя я рекомендую пересмотртеть подход к селекту. Выкладывай всё. Может там глобально оптимизировать можно. 

Автор: pseud 25.2.2010, 10:09
Deniz, рановато плюсик дал )
ибо конструкция
Код

and (tab777.date = coalesce(<параметр_дата>, tab777.date))

абсолютно всегда будет отсеивать записи со значением tab777.date = null

конструкция же
Код

and (<параметр_дата> is null or tab777.date = <параметр_дата>)

при незаданном параметре вернет все записи, в том числе tab777.date = null

Автор: Deniz 25.2.2010, 11:28
Цитата(pseud @  25.2.2010,  12:09 Найти цитируемый пост)
рановато плюсик дал )
 smile 
Цитата(pseud @  25.2.2010,  12:09 Найти цитируемый пост)
абсолютно всегда будет отсеивать записи со значением tab777.date = null

С Null'ами всегда есть грабли
Так же конструкция
Код
and (<параметр_дата> is null or tab777.date = <параметр_дата>)
не сможет выбрать только те записи, в которых tab777.date = null

Автор: pseud 25.2.2010, 12:12
Цитата(Deniz @  25.2.2010,  11:28 Найти цитируемый пост)
не сможет выбрать только те записи, в которых tab777.date = null

задача требует чего? 
Код

отобрать по конкретной дате или все. 

моя конструкция это решает.

если еще необходим и поиск отсутствия дат, то ваще огород имеем  smile 
Код

and ((<параметр_дата> is null and tab777.date is null) or tab777.date = <параметр_дата>)

но это мы с тобой далеко ушли  smile 

Автор: Deniz 25.2.2010, 13:45
pseud, мы еще и не туда дойдем  smile 
Но, ТС пометил вопрос как решенный, думаю не стоит дальше продолжать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)