Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql从JSONB字段中的对象数组获取密钥_Postgresql_Jsonb_Postgresql Json - Fatal编程技术网

Postgresql从JSONB字段中的对象数组获取密钥

Postgresql从JSONB字段中的对象数组获取密钥,postgresql,jsonb,postgresql-json,Postgresql,Jsonb,Postgresql Json,这里是jsonb列的虚拟数据 [ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }] 我想从对象的jsonb数组中获取所有名称键值…需要输出- [ [ "sun11", "sun12" ], [ "sun12", "s

这里是jsonb列的虚拟数据

[ { "name": [ "sun11", "sun12" ], "alignment": "center", "more": "fields" }, { "name": [ "sun12", "sun13" ], "alignment": "center" }, { "name": [ "sun14", "sun15" ] }]
我想从对象的jsonb数组中获取所有名称键值…需要输出-

[ [ "sun11", "sun12" ], [ "sun12", "sun13" ], [ "sun14", "sun15" ] ]
问题是,我能够通过提供索引(如0、1等)来获取name键值

SELECT data->0->'name' FROM public."user";
[ "sun11", "sun12" ]
但是我无法从同一个对象数组中获取所有的名称键值,我只想从json对象数组中获取所有的键值。任何帮助都会有帮助。谢谢

(首先是最终查询,下面是中间步骤)

  • j
    sonb\u array\u elements()
    将每个数组元素展开为一行
  • ->
    运算符为属性名提供数组;然后,
    jsonb_agg()
    将所有提取的数组再次放入一个数组中
  • 我的例子

    SELECT DISTINCT sub.name FROM (
    
    SELECT
    jsonb_build_object('name', p.data->'name') AS name
    FROM user AS u
    WHERE u.data IS NOT NULL
    ) sub
    WHERE sub.name != '{"name": null}';
    

    你能解释一下这是如何工作的吗?
    elems.value->“name”
    ?或者elems.vlaue是什么意思?jsonb_数组_元素创建一个名为“value”的新列。在此行中,已插入所有数组元素。您可以通过elems.value(参见fiddle)选择它们。现在,可以要求这些元素中的每一个元素输入键“name”的值。
    SELECT DISTINCT sub.name FROM (
    
    SELECT
    jsonb_build_object('name', p.data->'name') AS name
    FROM user AS u
    WHERE u.data IS NOT NULL
    ) sub
    WHERE sub.name != '{"name": null}';