Заменить NVL в запросе SQL - PullRequest
2 голосов
/ 27 июля 2011

Я встретил такой запрос в базе данных:

SELECT col_a
FROM my_table
WHERE
  nvl(col_b, 0) in
    nvl(nvl(:arg, col_b), 0)

Это вернет col_a из моей таблицы, где:

  • col_b ==: arg
  • или if: arg is null возвращает всю таблицу

Это выглядит как довольно запутанный способ вернуть одну или все записи, соответствующие входному аргументу, или просто выбрать всю таблицу в зависимости от значениявходного аргумента.

Есть ли более простой способ достижения того же эффекта?

Кроме того, я отмечаю, что NVL специфичен для Oracle, есть ли какое-то преимущество от его использования в этом случаесвыше COALESCE?

1 Ответ

6 голосов
/ 27 июля 2011

Это довольно запутанно.Я бы предпочел:

SELECT col_a
FROM my_table
WHERE (col_b = :arg OR :arg IS NULL) 

Нет преимуществ от NVL над COALESCE, фактически наоборот.Тем не менее, NVL существует в Oracle дольше (и короче, чтобы печатать) и, следовательно, имеет тенденцию привыкать больше.исходный SQL, который, как я подозреваю, был неверным: если: arg = 0, то исходный SQL будет возвращать строки, в которых col_b равно нулю или 0!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...