开发者社区 问答 正文

在postgres中获取JSON字段的键

我把这个Json放在Postgres中Json类型的一个列中

{ "核心时间":{ " TMP _临床_时间_麻醉学_输出_日期时间":{ "值":1 }、" TMP _临床_时间_麻醉学_输入_日期时间":{ "值":2 }、" TMP _临床_时间_外科_输出_日期时间":{ "值":3 }、" TMP _临床_时间_房间_输入_日期时间":{ "值:4 }、" TMP _临床_时间_房间_输出_日期时间":{ "值:空}、" TMP _临床_时间_块_输出_输出_日期时间":{ "值:空}

我需要这个结果:

列{“值”:1}{“值”:2}{“值”:3}{“值”:4}{“值”:null}{“值”:null}{“值”:null}

如果json属性可以动态变化(关键字“coreTimes”是固定的),我可以使用什么postgres函数来获得这个结果?

选择res. * FROM sopinterventionsaux,JSON_TABLE ( operating_times,$ . Coretimes . * " COLUMN(值VARCAR2(2000)FORMAT JSON PATH ' $ '))RES

展开
收起
1128944438887630 2019-11-29 21:41:16 1090 分享 版权
阿里云 AI 助理回答

在PostgreSQL中,要从一个动态结构的JSON对象中提取所有"值",可以使用jsonb_each_text()函数配合一些JSON路径查询技巧来实现。但是,直接获取你想要的精确格式可能需要多一步处理,因为PostgreSQL的标准函数可能不会直接生成你示例中的那种列式结果。不过,你可以先提取所有的键值对,然后构造出接近的结果。

考虑到你的需求和JSON结构,以下是一个可能的解决方案步骤:

步骤1: 提取所有"值"

首先,使用jsonb_each_text()遍历JSON对象中的每个键值对,并且只关注那些值为对象且含有"值"键的项。这可以通过在jsonb_each_text()基础上结合条件过滤来完成。但请注意,这个方法会直接返回每一对键和对应的"值",而不是以你所希望的列形式。

SELECT 
    key, 
    (value ->> '值')::text AS value_text
FROM 
    sopinterventionsaux,
    jsonb_each(operating_times -> '核心时间') AS js(key, value)
WHERE 
    value ? '值';

步骤2: 构造期望的输出格式

由于PostgreSQL不直接支持将查询结果直接构造成你所需的特定列式输出(即每一行是一个单独的{“值”: X}形式),你可能需要在应用程序层面处理这些数据,或者如果必须在数据库层面完成,可以考虑创建一个存储过程或自定义函数来组装这样的输出。

如果你的应用程序能够处理数组或集合类型,更简单的做法是直接构建一个包含所有"值"的数组:

SELECT 
    array_agg((value ->> '值')::text) AS values_array
FROM 
    sopinterventionsaux,
    jsonb_each(operating_times -> '核心时间') AS js(key, value)
WHERE 
    value ? '值';

这将给你一个数组,如{'1', '2', '3', '4', null, null, null},然后在应用层根据需要格式化。

注意

  • 上述SQL假设operating_times是你表中存储JSON的列名,且你希望遍历的是"核心时间"下的所有子对象。
  • ?操作符用于检查JSON对象中是否存在指定的键。
  • 请根据实际情况调整表名和列名。

由于直接在SQL查询中生成你所描述的精确列式字符串输出较为复杂,建议在获取到所需数据后,在应用程序中进一步处理以达到最终格式要求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: