【发布时间】:2017-11-08 23:20:50
【问题描述】:
我在 Oracle 数据库的 VARCHAR2 列中有如下 JSON 字符串。
{
"name": "Bob",
"age": "20",
"extras": {
"address": "123 Main St"
}
}
我想从 JSON 字符串中删除“extras”节点并返回结果,如:
{
"name": "Bob",
"age": "20"
}
我已经知道如何使用 Oracle JSON 函数(如 json_value, json_table, json_query)解析 JSON 字符串的片段。不幸的是,我被困在 Oracle 12.1 上,所以我不能使用像 json_object, json_aggobject 这样的函数,这些函数是在 12.2 中添加的。
我尝试使用类似json_query(data, '$["name"]["age"]')(参见this)的路径语法,但Oracle 似乎不支持这种路径语法。
我可以通过从原始对象中显式提取每个已知键并使用串联重新组合来解决此问题,例如:
select '{"name":"' || json_value(data,'$.name')
||'","age":"' || json_value(data,'$.age') || '"}' result
from (
select '{"name":"Bob","age":"20","extras":{"address":"123 Main St"}}' data
from dual);
但我想一般地这样做,这样我就不会将键硬编码到 SQL 表达式中(我希望将来可能会添加其他键)。
如何在我的 SQL 语句中不硬编码键列表而仅删除“附加”节点?
【问题讨论】: