【问题标题】:Query json dictionary data in SQLSQL中查询json字典数据
【发布时间】:2020-08-04 09:42:03
【问题描述】:

我的表中的 CLOB 字段包含 JSON,如下所示:

{"a":"value1", "b":"value2", "c":"value3"}

我正在尝试编写一个 SQL 查询来返回一个包含如下键和值字段的表:

key|value
---|------
a  |value1
b  |value2
c  |value3

任何帮助将不胜感激!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    如果您想要行而不是列中的值,请使用JSON_TABLE,然后使用UNPIVOT

    SELECT *
    FROM   (
      SELECT p.*
      FROM   table_name t
             CROSS JOIN
             JSON_TABLE(
               t.value,
               '$'
               COLUMNS (
                 a PATH '$.a',
                 b PATH '$.b',
                 c PATH '$.c'
               )
             ) p
    )
    UNPIVOT ( value FOR key IN ( a, b, c ) );
    

    所以对于一些示例数据:

    CREATE TABLE table_name (
      value CLOB CONSTRAINT ensure_json CHECK (value IS JSON)
    );
    
    INSERT INTO table_name ( value ) VALUES ( '{"a":"value1", "b":"value2", "c":"value3"}' );
    

    这个输出:

    关键 |价值 :-- | :----- 一个 |价值1 乙|价值2 C |价值3

    db小提琴here


    如果您想动态执行此操作,则可以在 PL/SQL 中解析 JSON 并使用 GET_KEYS 获取键名集合,然后通过其位置访问正确的名称,并使用 @987654328 将其与值相关联@:

    CREATE FUNCTION get_key(
      pos  IN PLS_INTEGER,
      json IN CLOB
    ) RETURN VARCHAR2 
    AS
      doc_keys JSON_KEY_LIST;
    BEGIN
      doc_keys := JSON_OBJECT_T.PARSE ( json ).GET_KEYS;
      RETURN doc_keys( pos );
    END get_key;
    /
    

    然后:

    SELECT get_key( j.pos, t.value ) AS key,
           j.value
    FROM   table_name t
           CROSS APPLY JSON_TABLE(
             t.value,
             '$.*'
             COLUMNS (
               pos   FOR ORDINALITY,
               value PATH '$'
             )
           ) j;
    

    输出:

    关键 |价值 :-- | :----- 一个 |价值1 乙 |价值2 c |价值3

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2023-02-20
      • 2017-07-16
      • 2023-03-29
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 2019-04-29
      相关资源
      最近更新 更多