Сравнение двух значений со значением FALSE только в том случае, если оба значения не равны NULL и не совпадают - PullRequest
0 голосов
/ 26 ноября 2009

Где пункт: Я должен проверить столбец со значением в Proc, но если хотя бы один из них имеет значение null, это должно быть ИСТИНА в результате. Только когда BOTH NOT NULL (это целочисленные значения для столбца ID в таблице), результат сравнения должен быть FALSE.

Теперь у меня есть это: ...

and nvl(nvl(b.account_id, account_id_), 0) = nvl(nvl(account_id_, b.account_id), 0)

b.account__id - это столбец в таблице (целое число), account_id_ - параметр в Proc того же типа.

Это работает, но ИМХО это выглядит странно, чтобы понять, какова цель оценки. Поэтому я попытался сделать его более читабельным, но без действительно хороших результатов.

Я пробовал COALESCE - но он требует проверки на ноль, если оба - ноль. LNNVL хороший, но он дает FALSE, если они оба равны, но мне нужно True для этого случая.

Какие-нибудь хорошие мысли?

Ответы [ 2 ]

2 голосов
/ 26 ноября 2009

Если я правильно понял, это должно сделать это:
(b.account_id IS NULL OR account_id_ IS NULL OR b.account_id = account_id_)

0 голосов
/ 27 ноября 2009

Это:

and nvl(nvl(b.account_id, account_id_), 0) = nvl(nvl(account_id_, b.account_id), 0)

... совпадает с:

AND COALESCE(b.account_id, account_id_, 0) = COALESCE(account_id_, b.account_id, 0)

Оба слишком сложны. Если ваш параметр имеет значение null, критерий фильтрации для b.account_id отсутствует, так как значение будет совпадать само по себе, или значения NULL станут равными 0 и, следовательно, будут равны.

На ваш выбор:

AND b.account_id = COALESCE(account_id_, b.account_id)
AND (account_id_ IS NULL OR b.account_id = account_id_)

Оба являются переносимым синтаксисом, но я склоняюсь к использованию COALESCE, чтобы избежать, по возможности, OR s из-за проблем с обслуживанием и проходимостью.

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