当键的名称中有点时(在 oracle 中),我如何访问 JSON 值?

Posted

技术标签:

【中文标题】当键的名称中有点时(在 oracle 中),我如何访问 JSON 值?【英文标题】:How I can access a JSON value when the key has dot inside its name (in oracle)? 【发布时间】:2020-08-11 15:37:39 【问题描述】:

如何获得“b.c”键的值?我需要以有效的方式提取那个 2。 我只是得到空


select  js,
        json_value(js,'$.a')  a_value, -- work correctly and give 1
        json_value(js,'$.b.c') b_c_value, -- doesn't work and give null
        json_query(js,'$.b.c') b_c_query  -- I saw this solution somwhere but this also give null
from (select '"a": "1","b.c": "2"' js from dual)  -- sample JSON

【问题讨论】:

json_value(js,'$."b.c"'). 太棒了。谢谢你。请把它贴出来让我接受它 【参考方案1】:

将密钥放在双引号中。所以,

json_value(js,'$."b.c"') b_c_value

完整示例:

select  js,
        json_value(js,'$."b.c"') b_c_value
from (select '"a": "1","b.c": "2"' js from dual)  -- sample JSON
+-----------------------+-----------+
|          JS           | B_C_VALUE |
+-----------------------+-----------+
| "a": "1","b.c": "2" |         2 |
+-----------------------+-----------+

【讨论】:

【参考方案2】:

一种选择是使用 DB 版本 12.1.0.2 中引入的 JSON_TABLE() 函数:

WITH t(js) AS
(
 SELECT '"a": "1","b.c": "2"' FROM dual
)
SELECT a_value, b_c_value
  FROM t
 CROSS JOIN JSON_TABLE(js, '$'
                           COLUMNS ( 
                                     a_value   INT PATH '$.a',
                                     b_c_value INT PATH '$."b.c"' ) )

A_VALUE B_C_VALUE
------- ---------
      1         2

Demo

【讨论】:

以上是关于当键的名称中有点时(在 oracle 中),我如何访问 JSON 值?的主要内容,如果未能解决你的问题,请参考以下文章

当键的数量少于每个键的值的数量时,PySpark reduceByKey 会继续失败

关于map函数的方法参考,当键的类型为String时编译错误

metaData.getPrimaryKeys() 当键是复合的时返回单行

当键被分配字符串时,是不是有优化的 Map 版本?

当键是整数类型时,GraphQL 返回“名称必须匹配”错误

当键是一个只知道第一个元素的元组时,如何获取scala Map值?