PostgreSQL中嵌套JSON字符串属性提取返回null问题求解
问题分析
你的问题核心在于node字段存储的是字符串化的JSON,而非原生JSON对象。当你用-> 'node'取出值时,它是一个JSON类型的字符串(带外层双引号),直接转text后会保留这些引号,再转json得到的依然是字符串,而非可解析的JSON对象,自然无法提取id_属性。
解决方案
直接使用->>运算符取出node的纯文本内容(自动去掉外层双引号),再将其转换为JSON对象,最后提取目标属性即可。
简化后的正确查询
SELECT (('{"tags": ["projects"], "doc_id": "None", "node": "{\"id_\": \"0de73396-5b02-4e7e-895b-70fd09c1ec0c\", \"embedding\": null}" }'::json ->> 'node')::json ->> 'id_') AS node_id;
更简洁的写法(PostgreSQL 16+)
如果你使用的是PostgreSQL 16及以上版本,可以用json_parse函数直接解析字符串化的JSON,代码更直观:
SELECT json_parse( '{"tags": ["projects"], "doc_id": "None", "node": "{\"id_\": \"0de73396-5b02-4e7e-895b-70fd09c1ec0c\", \"embedding\": null}"'::json ->> 'node' ) ->> 'id_' AS node_id;
关键知识点
->:返回JSON类型的值(保留JSON结构,包括字符串的外层引号)->>:返回文本类型的值(自动去除JSON字符串的外层引号,得到纯文本内容)- 当存储的JSON嵌套了字符串化的JSON时,必须先取出纯文本再解析为JSON对象,才能访问内部属性
内容的提问来源于stack exchange,提问作者Kent Daniel
相关产品推荐
相关产品推荐

