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

Есть запрос обычный в процедур и есть входящий параметры процедуры.
Условие задачи - необходимо обойти условие 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
Обход условия where в запросе (без динамического SQL)
    #38680816
m&m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
m&m
Гость
Александр Тарасенко,

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

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

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

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

Вот, даже работает! на базе 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
Обход условия where в запросе (без динамического SQL)
    #38683745
or_or_or_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Обход условия where в запросе (без динамического SQL)
    #38683793
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
or_or_or_,

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


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