Как правильно отфильтровать значения NULL по одному сложному (для меня) условию?

Нужна ваша помощь. Есть таблица вида

ID HIGH LOW
id1 '1' (null)
id1 '1' (null)
id1 (null) (null)
id2 (null) (null)
id2 (null) (null)
id2 (null) (null)
id2 (null) (null)
id2 (null) (null)

Каким запросом можно отфильтровать столбец ID, чтобы туда попали только те ID, для которых во всех строках значения HIGH и LOW равны NULL (Поля HIWH и LOW являются типом VARCHAR2, не числом).

Т.е. для ID1, несмотря на то, что одна строка попадает под условие, не должен попасть в выборку, т.к. имеет строки не подходящие по условия. А вот ID2 - должен, т.к. у него во всех строках HIGH и LOW значения NULL.


Ответы (1 шт):

Автор решения: SwaD

Ниже селект из вашего первого вопроса, только модифицированный с использованием функции nvl.

nvl в качестве аргументов принимает 2 значения, первое это проверяемое значение(обычно поле, но можно и функцию вставить), второе возвращаемое значение, если первое оказалось NULL.

В примере ниже, nvl(high, 0) - если поле high будет null, вернется 0.

Так же можно передавать в качестве второго параметра поля и функции.

select id from high_and_low
group by id
having sum(nvl(high, 0)) + sum(nvl(low, 0)) = 0

Для строк можно попробовать преобразовать null к такому значению, которого гарантированно нет в полях и сравнивать с объединением значений:

select id from high_and_low
group by id
having nvl(high, 'NullValue') || nvl(low, 'NullValue') = 'NullValueNullValue'
→ Ссылка