【问题标题】:oracle CLOB modify to obtain columns for json_table()oracle CLOB 修改以获取 json_table() 的列
【发布时间】:2023-02-17 01:36:45
【问题描述】:

由于 oracle 不支持将 JSON 列键动态转换为关系列和将 JSON 列值动态转换为关系列值,我曾想过将我的动态列列表生成为 CLOB 列

col_a,col_b,col_c,col_d

然后转换成下面的形式

col_a NUMBER(22,3) PATH '$.col_a',col_b NUMBER(22,3) PATH '$.col_b',col_c NUMBER(22,3) PATH '$.col_c',col_d NUMBER(22,3) PATH '$.col_d'

基本上我的每个列“col_a”都转换为“col_a NUMBER(22,3) PATH '$.col_a'”

这样我就可以直接将这个 clob 值放在我的 plsql 块中并像下面这样获取

select t.*,jt.*
from 
table_1 t,
json_table(t.json_doc,'$' columns (col_a NUMBER(22,3) PATH '$.col_a',col_b NUMBER(22,3) PATH '$.col_b',col_c NUMBER(22,3) PATH '$.col_c',col_d NUMBER(22,3) PATH '$.col_d'))jt

但我不确定我是否可以使用 REPLACE 或任何其他功能来做到这一点。 我可以通过在生成动态列的原始列表时连接来实现它,但我想避免这种额外的负担。

注意:所有列都是 NUMBER(22,3) 数据类型,所以这不是负担。

【问题讨论】:

    标签: json oracle concatenation


    【解决方案1】:

    如果您的 CLOB 是有效的 JSON,您可以使用函数 json_dataguide 检索 CLOB 的键。下面是一个例子

    我的桌子

    create table json_doc (
        data clob check (data is json)
    );
    
    insert into json_doc(data) values ('{"col1": "A"}');
    insert into json_doc(data) values ('{"col2": "B"}');
    

    检查表格

    select doc.data from json_doc doc;
    --   DATA
    -- 1 {"col1": "A"}
    -- 2 {"col2": "B"}
    

    然后使用 json_dataguide

    select json_dataguide(doc.data) columns from json_doc doc;
    --   COLUMNS
    -- 1 [{"o:path":"$","type":"object","o:length":16},{"o:path":"$.col1","type":"string","o:length":1},{"o:path":"$.col2","type":"string","o:length":1}]
    

    最后,使用 json_table

    select jt.* from 
        (select json_dataguide(doc.data) columns from json_doc doc) d, 
        json_table(d.columns, '$[*]' COLUMNS (
            path varchar2(22) path '$."o:path"'
        )) jt
    --   PATH
    -- 1 $
    -- 2 $.col1
    -- 3 $.col2
    

    然后您可以获得包含根的 JSON 密钥(您可以轻松删除它以及开头的 $.,也许使用 LTRIM)。 如果这解决了您的问题,请记住将其标记为答案;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-01
      • 2012-11-04
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2013-08-17
      • 1970-01-01
      相关资源
      最近更新 更多