数组在PostgreSQL中都是NULL

Edm*_*und 6 sql arrays postgresql null

如果PostgreSQL数组的所有元素都为NULL,是否有一个返回TRUE的表达式?

如果它是一个非NULL的值,我当然可以使用类似的东西:

SELECT 4 = ALL (ARRAY[4,5]::integer[]);
Run Code Online (Sandbox Code Playgroud)

但是我想用IS NULL测试而不是= 4测试来进行ALL操作.我不认为这有一个ALL语法,并且NULL周围的语义与数组复合我自己无法想到实现它的形式.因此我问Stack Overflow.;-)

我知道我可以在pl/sql或pl/pgsql中编写一个函数来执行此操作,但是我想在使用它之前看看是否有直接表达式.

Mic*_*uen 9

我想我得到了最短的答案,同时仍然保留了4 = ALL (ARRAY[4,5]::integer[]);构造:

select
y, true = ALL (select unnest(z) is null)
from x
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 9

1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL
Run Code Online (Sandbox Code Playgroud)

1并且2可以是任何两个不同的数字.

替代品和性能

有几种方法.我组装了一个测试用例,看看哪个是最快的:

SELECT arr
     , 1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL      AS chk_simpl
     , TRUE = ALL (SELECT unnest(arr) IS NULL)            AS chk_michael
     , (SELECT bool_and(e IS NULL) FROM unnest(arr) e)    AS chk_bool_and
     , NOT EXISTS (SELECT unnest(arr) EXCEPT SELECT null) AS chk_exist
FROM  (
   VALUES
     ('{[1,2,NULL,3}'::int[])
    ,('{1,1,1}')
    ,('{2,2,2}')
    ,('{NULL,NULL,NULL]}'::int[])
   ) t1(arr);
Run Code Online (Sandbox Code Playgroud)

第二个是@michael目前接受的答案.列按表达式的性能顺序排列.最快的.我提出的表达式实际上比其他表达式快很多倍.因此我的答案.

SQL小提琴演示和性能测试.

它是如何工作的?

表达式1 = ALL(arr)产生

TRUE ..如果所有元素都是1
FALSE..如果任何元素是<> 1(任何元素IS NOT NULL)
NULL ..如果至少有一个元素IS NULL而没有元素<> 1

所以,如果我们知道一个无法显示的单个元素-1,我们可以简化为:

-1 = ALL(arr) IS NULL
Run Code Online (Sandbox Code Playgroud)

如果可以显示任何数字,请检查两个不同的数字.结果只能是NULL两个数组都包含的结果NULL.瞧.