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 )
(这不会起作用ERROR: set-valued function called in context that cannot accept a set)
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
交叉表不可行,因为密钥的数量可能很大.
Le *_*oid 10
最短:
SELECT count(*) FROM jsonb_object_keys('{"a": 1, "b": 2, "c": 3}'::jsonb);
返回3
如果你想要一张表中所有的json键,它会给出:
SELECT (SELECT COUNT(*) FROM json_object_keys(myJsonField)) nbr_keys FROM myTable;
您可以将键转换为数组并使用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;
如果您需要为整个表获取此信息,则可以按主键分组.
虽然必须使用子选择将 JSON 键集转换为行,但通过跳过构建临时数组,以下调整后的查询可能会运行得更快:
SELECT count(*) FROM
   (SELECT jsonb_object_keys('{"a": 1, "b": 2, "c": 3}'::jsonb)) v;
而且有点短;)
使其成为一个函数:
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$