我把这个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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在PostgreSQL中,要从一个动态结构的JSON对象中提取所有"值"
,可以使用jsonb_each_text()
函数配合一些JSON路径查询技巧来实现。但是,直接获取你想要的精确格式可能需要多一步处理,因为PostgreSQL的标准函数可能不会直接生成你示例中的那种列式结果。不过,你可以先提取所有的键值对,然后构造出接近的结果。
考虑到你的需求和JSON结构,以下是一个可能的解决方案步骤:
首先,使用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 ? '值';
由于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}
,然后在应用层根据需要格式化。
operating_times
是你表中存储JSON的列名,且你希望遍历的是"核心时间"
下的所有子对象。?
操作符用于检查JSON对象中是否存在指定的键。由于直接在SQL查询中生成你所描述的精确列式字符串输出较为复杂,建议在获取到所需数据后,在应用程序中进一步处理以达到最终格式要求。