Булево сравнение нулевых значений в массивах postgres - PullRequest
1 голос
/ 10 января 2020

У меня есть следующая таблица:

   id    | row_2 
---------+---------------
       1 | {t,NULL}
       2 | {NULL}

Я хочу сохранить строки, которые являются истинными или пустыми, и отфильтровать строки, в которых массив содержит ложное значение. Я сделал это:

SELECT
    *
FROM
    my_table t
WHERE
    not (false = ANY (t.row_2));

Это не работает, потому что сравнение с нулевым значением приводит к нулю. То есть этот ...

SELECT not false = any (ARRAY[true, true]);
SELECT not false = any (ARRAY[false, false]);

... выводит значения true и false соответственно (как и ожидалось). Но это ...

SELECT not false = any (ARRAY[true, null]);

... вывод NULL.

1 Ответ

1 голос
/ 10 января 2020

Обычно полезно использовать coalesce() для корректировки null сравнений:

select *
from my_table
where not coalesce(false = any(row_2), false)

Db <> Fiddle.

Обратите внимание, что согласно документации из ANY/SOME(array) (выделение мое):

Кроме того, если правый массив содержит нулевые элементы и нет истинного сравнения результат получен, результат ЛЮБОЙ будет нулевым, а не ложным

...