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中编写一个函数来执行此操作,但是我想在使用它之前看看是否有直接表达式.
我想我得到了最短的答案,同时仍然保留了4 = ALL (ARRAY[4,5]::integer[]);构造:
select
y, true = ALL (select unnest(z) is null)
from x
Run Code Online (Sandbox Code Playgroud)
1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULLRun 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目前接受的答案.列按表达式的性能顺序排列.最快的.我提出的表达式实际上比其他表达式快很多倍.因此我的答案.
表达式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.瞧.