Как использовать динамический оператор И или ИЛИ в предложении where в DB2? - PullRequest
0 голосов
/ 18 марта 2019
DECLARE FILTER_DATA CURSOR WITH RETURN FOR
SELECT C_ID, C_NAME 
FROM DB2ADMIN.COURSES
WHERE C_ID = PARM_ID AND AND C_NAME = PARM_NAME

Процедура содержит этот курсор, и курсор имеет оператор AND в предложении WHERE, но я хочу сделать этот оператор динамическим на основе параметра процедуры.

, чтобы курсор возвращал набор результатовна основе оператора AND или OR.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Не.

Подготовьте / используйте отдельный оператор SQL для каждого возможного случая / предиката (каждый возможный вид выражения where) и выберите тот, который нужно использовать, основываясь на вводимых пользователем данных.

Технически допустимо писать такие вещи, как

WHERE :PARM_ID IS NULL OR ID = :PARM_ID

или

WHERE (:CASE = 'OR' AND (C_1 OR C_2)) OR (:CASE = 'AND' AND (C_1 AND C_2))

, но вы стоите оченьмало шансов, что это также будет приемлемым с точки зрения производительности.(У вас есть почти гарантия полного сканирования таблицы для каждого отдельного вызова.)

1 голос
/ 18 марта 2019

Использовать динамический sql.

begin
  ...  
  DECLARE FILTER_DATA CURSOR WITH RETURN FOR s1;

  CASE PARM_FLAG
    WHEN 1 THEN
      PREPARE S1 FROM 'SELECT C_ID, C_NAME FROM DB2ADMIN.COURSES WHERE C_ID = ? AND C_NAME = ?';
    ELSE
      PREPARE S1 FROM 'SELECT C_ID, C_NAME FROM DB2ADMIN.COURSES WHERE C_ID = ? OR C_NAME = ?';
  END CASE;

  OPEN FILTER_DATA USING PARM_ID, PARM_NAME;
end@

Если вы ожидаете ввода параметра NULL, вы можете сделать что-то подобное для каждого оператора:

PREPARE S1 FROM 'SELECT C_ID, C_NAME FROM DB2ADMIN.COURSES WHERE '
||case when PARM_ID is null then 'cast(? as int) is null' else 'C_ID = ?' end
||' AND '
||case when PARM_NAME is null then 'cast(? as varchar(1)) is null' else 'C_NAME = ?' end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...