【发布时间】:2020-08-04 09:42:03
【问题描述】:
我的表中的 CLOB 字段包含 JSON,如下所示:
{"a":"value1", "b":"value2", "c":"value3"}
我正在尝试编写一个 SQL 查询来返回一个包含如下键和值字段的表:
key|value
---|------
a |value1
b |value2
c |value3
任何帮助将不胜感激!
【问题讨论】:
我的表中的 CLOB 字段包含 JSON,如下所示:
{"a":"value1", "b":"value2", "c":"value3"}
我正在尝试编写一个 SQL 查询来返回一个包含如下键和值字段的表:
key|value
---|------
a |value1
b |value2
c |value3
任何帮助将不胜感激!
【问题讨论】:
如果您想要行而不是列中的值,请使用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
【讨论】: