Я хочу понять, почему именно вы можете сравнивать пустые значения как равные внутри массивов, а не как примитивы.
Например, следующий запрос демонстрирует:
SELECT NULL = NULL AS does_not_equal
, NULL::bool = NULL::bool AS does_equal
, NULL::int = NULL::int AS does_equal
, NULL::text = NULL::text AS does_equal
, ARRAY[NULL] = ARRAY[NULL] AS does_equal
, ARRAY[NULL]::bool[] = ARRAY[NULL]::bool[] AS does_equal
, ARRAY[NULL]::int[] = ARRAY[NULL]::int[] AS does_equal
, ARRAY[NULL]::text[] = ARRAY[NULL]::text[] AS does_equal
;
Я понимаюпочему NULL = NULL равно NULL для примитивов, и я также думаю, что понимаю, почему сравнение составных типов даст истинное сравнение для поля в них, которое является нулевым с обеих сторон, в основном из-за оператора * =, который просматривает двоичное значениетип.Но в массивах, похоже, не используется оператор * =, и я пока не смог найти ничего, объясняющего это в моих поисках.