验证 json[] 数组不为空的最快方法是什么?

Jar*_*bzo 9 postgresql array json

我想验证一json[]the_array不为空。对于普通数组,我可以检查:

the_array != '{}'
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于 a json[],如下所示:

select '{}'::json[] != '{}'
ERROR:  could not identify an equality operator for type json
Run Code Online (Sandbox Code Playgroud)

我可以改用以下检查:

array_length(the_array, 1) != null // yes, array_length on an
                                      empty array returns null
Run Code Online (Sandbox Code Playgroud)

我担心这array_length()会遍历整个数组以计算项目数,然后返回该计数。就我而言,我不需要数组的实际大小,我只需要知道它是否为空。

那么,是否array_length()遍历整个数组?如果是这样,是否有更好的方法来检查 json 数组是否为空?

Eva*_*oll 12

这不是返回 JSON 数组。

SELECT '{}'::json[]
Run Code Online (Sandbox Code Playgroud)

该类型json[]不是“JSON 数组”,而是 JSON 类型的 SQL 数组。你永远不应该使用这种结构。这几乎可以肯定是糟糕设计的危险信号。

您要检查的是 Real JSON Array 不为空,您可以使用jsonb_array_length(jsonb). JSON 存储为JSON,或JSONB用于二进制 json。

SELECT jsonb_array_length( '[]'::jsonb );
Run Code Online (Sandbox Code Playgroud)

看看有没有空

SELECT jsonb_array_length( '[]'::jsonb ) = 0;
Run Code Online (Sandbox Code Playgroud)

警告,这只是计算这些元素,它们可能是 null

SELECT jsonb_array_length( '[null]'::jsonb );
Run Code Online (Sandbox Code Playgroud)

所以你可能想先调用jsonb_strip_nulls()数组。