Динамическое построение Where clause

Silbermann
Дата: 21.02.2007 07:52:26
Привет. Есть view, мне нужно, в зависимости от параметров (например параметров какого-то пакета, которые задаются перед вызовом этой view), сформировать раздел where этой view. Потыкался с CASE-ом - ничего не вышло, там довольно-таки громоздские части изменяются в зависимости от этих параметров. Подскажите как быть ? Спасибо
Бомж
Дата: 21.02.2007 08:59:29
Вот тут почитайте.
Silbermann
Дата: 21.02.2007 09:56:36
Спасибо за ссылку. Только с помощью параметров походу мне не удастся сделать, то, что я хочу. Т.е., например, есть несколько вариантов WHERE блока, где меняются не только параметры. Вот скажем, как разрулить следующую ситуацию ?

Вариант 1:
WHERE
(t1.field1='value'
or t2.field1 like '%value1%'
or t2.field1 like '%value2%'
)

Вариант 2:
WHERE
(t.field='value'
and t2.field1 not like '%value1%'
and t2.field1 not like '%value2%'
)

Т.е. в одном случае используется OR, а вдругом AND.
Elic
Дата: 21.02.2007 10:04:47
Silbermann
Т.е. в одном случае используется OR, а вдругом AND.
Картинка с другого сайта.:
where (case when ... then 1 else 0 end + case...end + case...end) >= decode(:OrAnd, 'OR', 1, 'AND', 3)


А вообще для подобной задачи лучше попробовать использовать pipelined function.
Silbermann
Дата: 21.02.2007 10:10:35
Если не трудно, можете расписать эту строку приминительно для конкретного примера ?

Например, для

WHERE t1.field = 'val' AND t1.field = 'val2'

и

WHERE t1.field = 'val' OR t1.field = 'val2'

Спасибо.
Elic
Дата: 21.02.2007 10:19:55
Silbermann
Если не трудно, можете расписать эту строку приминительно для конкретного примера ?
Каждый case - это одно условие.
Бомж
Дата: 21.02.2007 10:21:50
Silbermann
Если не трудно, можете расписать эту строку приминительно для конкретного примера ?

Например, для

WHERE t1.field = 'val' AND t1.field = 'val2'

и

WHERE t1.field = 'val' OR t1.field = 'val2'

Спасибо.


WHERE MyPackage.PyFunc(t1.field, .....) = 1
ModelR
Дата: 21.02.2007 13:00:30
А простая логика не помогает (X, P, Q - логические выражения):
IF X THEN P ELSE Q == X AND P OR (NOT X) AND Q

where
Вариант=1 and 
(t1.field1='value'
or t2.field1 like '%value1%'
or t2.field1 like '%value2%'
) 
or
Вариант=2 and 
(t.field='value'
and t2.field1 not like '%value1%'
and t2.field1 not like '%value2%'
)
Амаразм
Дата: 01.03.2007 16:50:44
Мне кажется лучше выбрать с OR, и сверху ограничивать уже необходимый набор по полю type_
SELECT t1.*, t2.*,
           CASE WHEN t2.field1 LIKE '%value1%' AND t2.field1 LIKE '%value1%' AND t2.field1 LIKE '%value2%' THEN 1 ELSE 2 END type_
FROM ...
WHERE
(t1.field1='value'
OR t2.field1 like '%value1%'
OR t2.field1 like '%value2%'
)