如何在postgresql中计算JSON的setof/key数?

vin*_*lcy 9 sql postgresql json

我有一个jsonb存储地图的列,就像{'a':1,'b':2,'c':3}每行中键的数量不同.

我想算一下 - jsonb_object_keys可以检索密钥,但它在 setof

有这样的事吗?

(select count(jsonb_object_keys(obj) from XXX )
Run Code Online (Sandbox Code Playgroud)

(这不会起作用ERROR: set-valued function called in context that cannot accept a set)

Postgres JSON函数和操作符文档

json_object_keys(json)
jsonb_object_keys(jsonb)

setof text  Returns set of keys in the outermost JSON object.
json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}')  

json_object_keys
------------------
f1
f2
Run Code Online (Sandbox Code Playgroud)

交叉表不可行,因为密钥的数量可能很大.

Le *_*oid 10

最短:

SELECT count(*) FROM jsonb_object_keys('{"a": 1, "b": 2, "c": 3}'::jsonb);
Run Code Online (Sandbox Code Playgroud)

返回3

如果你想要一张表中所有的json键,它会给出:

SELECT (SELECT COUNT(*) FROM json_object_keys(myJsonField)) nbr_keys FROM myTable;
Run Code Online (Sandbox Code Playgroud)


hru*_*ske 6

您可以将键转换为数组并使用array_length来获取:

select array_length(array_agg(A.key), 1) from (
    select json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') as key
) A;
Run Code Online (Sandbox Code Playgroud)

如果您需要为整个表获取此信息,则可以按主键分组.


min*_*dex 5

虽然必须使用子选择将 JSON 键集转换为行,但通过跳过构建临时数组,以下调整后的查询可能会运行得更快:

SELECT count(*) FROM
   (SELECT jsonb_object_keys('{"a": 1, "b": 2, "c": 3}'::jsonb)) v;
Run Code Online (Sandbox Code Playgroud)

而且有点短;)

使其成为一个函数:

CREATE OR REPLACE FUNCTION public.count_jsonb_keys(j jsonb)
  RETURNS bigint
  LANGUAGE sql
AS $function$
SELECT count(*) from (SELECT jsonb_object_keys(j)) v;
$function$
Run Code Online (Sandbox Code Playgroud)