Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Обход условия where в запросе (без динамического SQL) / 11 сообщений из 11, страница 1 из 1
26.06.2014, 13:37
    #38680792
Александр Тарасенко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
Вопрос глупый, ну так уж получилось, будет время быстренько ответить - буду благодарен.

Есть запрос обычный в процедур и есть входящий параметры процедуры.
Условие задачи - необходимо обойти условие where, если параметр процедуры равен 0, и выполнить поиск, если <> 0.
Условно говоря, есть такой запрос:

CREATE PROCEDURE GET_FILTER (
IN SUPPLIERINPUT INTEGER)

select * from test_table tt
where SUPPLIERINPUT in (0, tt.suppl)

SUPPLIERINPUT м.б. 0 или не 0.

можно ли как-то обойти, чтобы where не запускалось (но без использования динамического sql).
...
Рейтинг: 0 / 0
26.06.2014, 13:55
    #38680816
m&m
m&m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
Александр Тарасенко,

по такому описанию можно предположить, что
нужен просто or с этим параметром,типа
where PARAM in () or (PARAM=0)
...
Рейтинг: 0 / 0
26.06.2014, 14:22
    #38680855
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
Александр Тарасенко,

Лучше использовать динамику.

Вы можете, конечно, заставить процедуру собраться с reopt always опцией типа:
call sysproc.set_routine_opts('reopt always')@
create procedure ... @
и посмотреть план запроса (в секции "Optimized Statement") из кэша запросов после каждого вызова процедуры, чтобы проверить, будет ли оптимизатор при каждом вызове в зависимости от значения параметра по-разному переписывать этот запрос (вроде должен, но лучше проверить).
Но все равно минус такого подхода в том, что все статические запросы процедуры будут выполняться в таком режиме, а это можнт быть неоптимально.
Да и для этого запроса лучше, если для него в кэше будут только 2 запроса, а не перекомпиляция его каждый раз при вызове...
...
Рейтинг: 0 / 0
26.06.2014, 15:54
    #38680994
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
Вариант - использовать два разных статических запроса, применяя нужный по обстоятельствам.
...
Рейтинг: 0 / 0
29.06.2014, 01:51
    #38682871
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
А если использовать
union из 2 похожих запросов
с разницей в WHERE и условием
param=0 и во втором param=1
может будет быстрее?
...
Рейтинг: 0 / 0
30.06.2014, 10:56
    #38683449
knudsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
Александр Тарасенко,

select * from test_table tt
where
( CASE SUPPLIERINPUT
when 0 then 0
else 1
end = 0)
or SUPPLIERINPUT = t.suppl
...
Рейтинг: 0 / 0
30.06.2014, 11:28
    #38683491
knudsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
Александр Тарасенко,

Вот, даже работает! на базе SAMPLE (9.7 Windows)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
CREATE PROCEDURE db2admin.GET_FILTER (
IN SUPPLIERINPUT INTEGER)
RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE c1 CURSOR WITH RETURN FOR
SELECT * FROM db2admin.ORG
WHERE 
     (case SUPPLIERINPUT
	      when 0 then 0 
		  else 1
     end = 0 ) 
	 OR  (deptnumb = SUPPLIERINPUT);
OPEN c1;	 
END;

C:\Program Files\IBM\SQLLIB\BIN>DB2 CALL DB2ADMIN.GET_FILTER(10)


  Набор результатов 1
  --------------

  DEPTNUMB DEPTNAME       MANAGER DIVISION   LOCATION
  -------- -------------- ------- ---------- -------------
        10 Head Office        160 Corporate  New York

  1 записей выбрано.

  Статус возврата = 0

C:\Program Files\IBM\SQLLIB\BIN>DB2 CALL DB2ADMIN.GET_FILTER(0)


  Набор результатов 1
  --------------

  DEPTNUMB DEPTNAME       MANAGER DIVISION   LOCATION
  -------- -------------- ------- ---------- -------------
        10 Head Office        160 Corporate  New York
        15 New England         50 Eastern    Boston
        20 Mid Atlantic        10 Eastern    Washington
        38 South Atlantic      30 Eastern    Atlanta
        42 Great Lakes        100 Midwest    Chicago
        51 Plains             140 Midwest    Dallas
        66 Pacific            270 Western    San Francisco
        84 Mountain           290 Western    Denver

  8 записей выбрано.

  Статус возврата = 0

C:\Program Files\IBM\SQLLIB\BIN>
...
Рейтинг: 0 / 0
30.06.2014, 14:23
    #38683745
or_or_or_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
knudsen
Код: sql
1.
2.
3.
4.
5.
6.
WHERE 
     (case SUPPLIERINPUT
	      when 0 then 0 
		  else 1
     end = 0 ) 
	 OR  (deptnumb = SUPPLIERINPUT);


is equal to:
(SUPPLIERINPUT = 0) or (deptnumb = SUPPLIERINPUT)
...
Рейтинг: 0 / 0
30.06.2014, 14:55
    #38683793
knudsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
or_or_or_,

таки, да
...
Рейтинг: 0 / 0
30.06.2014, 23:15
    #38684225
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
А чем плох мой вариант? Оптимизатор по идее 1 из подзапросов должен отвергнуть, т. к. статический параметр изначально будет не равен одному из условий?
...
Рейтинг: 0 / 0
01.07.2014, 16:44
    #38684974
Александр Тарасенко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход условия where в запросе (без динамического SQL)
Всем спасибо за предложенные варианты )
Буду проверять, что мне лучше подходит
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Обход условия where в запросе (без динамического SQL) / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]