Условие ввода пустого параметра Oracle PL \ SQL WHERE - PullRequest
5 голосов
/ 16 февраля 2011

На данный момент я использую IF ELSE для обработки этого условия

IF INPUT_PARAM IS NOT NULL

    SELECT ... FROM SOMETABLE WHERE COLUMN = INPUT_PARAM
ELSE
    SELECT ... FROM SOMETABLE

Есть ли лучший способ сделать это в одном запросе без циклов IF ELSE. Поскольку запрос становится сложным, таких входных параметров будет больше, и количество требуемых IF ELSE будет слишком большим.

Ответы [ 2 ]

9 голосов
/ 16 февраля 2011

Один из методов заключается в использовании варианта

 WHERE column = nvl(var, column)

Однако здесь есть два подводных камня:

  1. , если столбец обнуляем, этот пункт отфильтруетпустые значения, тогда как в вашем вопросе вы не будете фильтровать нулевые значения во втором случае.Вы можете изменить это предложение так, чтобы оно принимало во внимание значения NULL, но это выглядит ужасно:

        WHERE nvl(column, impossible_value) = nvl(var, impossible_value)
    

    Конечно, если когда-нибудь будет вставлен impossible_value, вы столкнетесь с некоторыми другими (забавными) проблемами.*

  2. Оптимизатор неправильно понимает этот тип предложения.Иногда он создает план с UNION ALL, но если их больше, чем пара nvl, вы получите полное сканирование, даже если присутствуют совершенно правильные индексы.

Вот почему, когда естьЕсть много параметров (например, несколько полей поиска в большой форме), мне нравится использовать динамический SQL:

DECLARE
   l_query VARCHAR2(32767) := 'SELECT ... JOIN ... WHERE 1 = 1';
BEGIN
   IF param1 IS NOT NULL THEN
      l_query := l_query || ' AND column1 = :p1';
   ELSE 
      l_query := l_query || ' AND :p1 IS NULL';
   END IF;
   /* repeat for each parameter */
   ...
   /* open the cursor dynamically */
   OPEN your_ref_cursor FOR l_query USING param1 /*,param2...*/; 
END;

Вы также можете использовать EXECUTE IMMEDIATE l_query INTO l_result USING param1;

3 голосов
/ 16 февраля 2011

Это должно работать

SELECT ... FROM SOMETABLE WHERE COLUMN = NVL( INPUT_PARAM, COLUMN )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...