将 JSON 解析为 oracle sql
Parsing JSON into oracle sql
我有一个具有 CLOB 数据类型的 table。该列的值实际上是 JSON 数据。
{"ClassId":32000,"Attributes":
[
{"Name":"ID","Value":"4548"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}
{"ClassId":30074,"Attributes":
[
{"Name":"ID","Value":"265794"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"100"},
{"Name":"GEO-METHOD","Value":"90"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}
如果我select table table 它会显示这样
我需要解析数据,以便获得 HMETHODE 和 HPRECISION 的输出。
Classid ID HREF HPRECISION HMETHOD
30074 265794 -1 5 96
32000 4548 -1 5 100
或者输出可能如下所示
我尝试了几种方法,但要么出错,要么找不到数据。如果有人可以解决此问题 sql,那将非常有帮助。
select ClassId, NAME, VALUE
from importitem D,
JSON_TABLE
(
D.JSON_DATA, '$' COLUMNS
(
ClassId NUMBER path '$.ClassId',
NESTED path '$.Attributes[*]' COLUMNS
(
NAME NUMBER PATH '$.Namne',
Value NUMBER PATH '$.Value'
)
)
) J ;
也可能是这样,两种方法我都试过了
SELECT *
FROM JSON_TABLE(
'{"ClassId":30074,
"Attributes":
[
{"Name":"ID","Value":"356605"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}',
'$.Attributes'
COLUMNS
ID NUMBER PATH '$.Namne.Value',
HREF NUMBER PATH '$.Namne.Value',
HPRECISION NUMBER PATH '$.Namne.Value',
HMETHOD NUMBER PATH '$.Namne.Value'
);
我认为,您 JSON 数据必须采用这种格式:
{"ClassId":32000,"Attributes":
[
{"ID":4548},
{"HREF":-1},
{"HPRECISION":5},
{"HMETHOD":96},
{"GEO-METHOD":96},
{"GEO-PRECISION":5},
{"GEO-VISIBILITY":0}
]
}
这是正确的格式,因为在这种格式中 JSON 有一个 KEYS(ID、HREF、HPRECISION...)并且这个 KEYS 有一个整数值(4548、-1、5)。在这种情况下,我们的查询将是:
SELECT CLASSID, ATRB_ID, HREF, HPRECISION, HMETHOD, GEOMETHOD, GEOPRECISION, GEOVISIBILITY
FROM TABLE2 T1
CROSS JOIN
JSON_TABLE(T1.JSON_DATA, '$' COLUMNS
(
CLASSID INTEGER PATH '$.ClassId',
ATRB_ID INTEGER PATH '$.Attributes.ID',
HREF INTEGER PATH '$.Attributes.HREF',
HPRECISION INTEGER PATH '$.Attributes.HPRECISION',
HMETHOD INTEGER PATH '$.Attributes.HMETHOD',
GEOMETHOD INTEGER PATH '$.Attributes."GEO-METHOD"',
GEOPRECISION INTEGER PATH '$.Attributes."GEO-PRECISION"',
GEOVISIBILITY INTEGER PATH '$.Attributes."GEO-VISIBILITY"'
)
)
但是,如果您 JSON 仅采用这种格式:
{"ClassId":32000,"Attributes":
[
{"Name":"ID","Value":"4548"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}
因此,我们可以编写查询:
SELECT CLASSID, ATRB_ID, HREF, HPRECISION, HMETHOD, GEOMETHOD, GEOPRECISION, GEOVISIBILITY
FROM TABLE1 T1
CROSS JOIN
JSON_TABLE(T1.JSON_DATA, '$[*]' COLUMNS
(
CLASSID INTEGER PATH '$.ClassId',
ATRB_ID VARCHAR2(100) PATH '$.Attributes[0]."Value"',
HREF VARCHAR2(100) PATH '$.Attributes[1]."Value"',
HPRECISION VARCHAR2(100) PATH '$.Attributes[2]."Value"',
HMETHOD VARCHAR2(100) PATH '$.Attributes[3]."Value"',
GEOMETHOD VARCHAR2(100) PATH '$.Attributes[4]."Value"',
GEOPRECISION VARCHAR2(100) PATH '$.Attributes[5]."Value"',
GEOVISIBILITY VARCHAR2(100) PATH '$.Attributes[6]."Value"'
)
)
结果将是:
CLASSID
ATRB_ID
HREF
HPRECISION
HMETHOD
GEOMETHOD
GEOPRECISION
GEOVISIBILITY
32000
4548
-1
5
96
96
5
0
30074
265794
-1
5
100
90
5
0
执行此查询,执行成功:
SELECT * FROM
JSON_TABLE('{"ClassId":32000,"Attributes":
[
{"Name":"ID","Value":"4548"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}', '$[*]' COLUMNS
(
CLASSID INTEGER PATH '$.ClassId',
ATRB_ID VARCHAR2(100) PATH '$.Attributes[0]."Value"',
HREF VARCHAR2(100) PATH '$.Attributes[1]."Value"',
HPRECISION VARCHAR2(100) PATH '$.Attributes[2]."Value"',
HMETHOD VARCHAR2(100) PATH '$.Attributes[3]."Value"',
GEOMETHOD VARCHAR2(100) PATH '$.Attributes[4]."Value"',
GEOPRECISION VARCHAR2(100) PATH '$.Attributes[5]."Value"',
GEOVISIBILITY VARCHAR2(100) PATH '$.Attributes[6]."Value"'
)
)
我有一个具有 CLOB 数据类型的 table。该列的值实际上是 JSON 数据。
{"ClassId":32000,"Attributes":
[
{"Name":"ID","Value":"4548"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}
{"ClassId":30074,"Attributes":
[
{"Name":"ID","Value":"265794"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"100"},
{"Name":"GEO-METHOD","Value":"90"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}
如果我select table table 它会显示这样
我需要解析数据,以便获得 HMETHODE 和 HPRECISION 的输出。
Classid ID HREF HPRECISION HMETHOD
30074 265794 -1 5 96
32000 4548 -1 5 100
或者输出可能如下所示
我尝试了几种方法,但要么出错,要么找不到数据。如果有人可以解决此问题 sql,那将非常有帮助。
select ClassId, NAME, VALUE
from importitem D,
JSON_TABLE
(
D.JSON_DATA, '$' COLUMNS
(
ClassId NUMBER path '$.ClassId',
NESTED path '$.Attributes[*]' COLUMNS
(
NAME NUMBER PATH '$.Namne',
Value NUMBER PATH '$.Value'
)
)
) J ;
也可能是这样,两种方法我都试过了
SELECT *
FROM JSON_TABLE(
'{"ClassId":30074,
"Attributes":
[
{"Name":"ID","Value":"356605"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}',
'$.Attributes'
COLUMNS
ID NUMBER PATH '$.Namne.Value',
HREF NUMBER PATH '$.Namne.Value',
HPRECISION NUMBER PATH '$.Namne.Value',
HMETHOD NUMBER PATH '$.Namne.Value'
);
我认为,您 JSON 数据必须采用这种格式:
{"ClassId":32000,"Attributes":
[
{"ID":4548},
{"HREF":-1},
{"HPRECISION":5},
{"HMETHOD":96},
{"GEO-METHOD":96},
{"GEO-PRECISION":5},
{"GEO-VISIBILITY":0}
]
}
这是正确的格式,因为在这种格式中 JSON 有一个 KEYS(ID、HREF、HPRECISION...)并且这个 KEYS 有一个整数值(4548、-1、5)。在这种情况下,我们的查询将是:
SELECT CLASSID, ATRB_ID, HREF, HPRECISION, HMETHOD, GEOMETHOD, GEOPRECISION, GEOVISIBILITY
FROM TABLE2 T1
CROSS JOIN
JSON_TABLE(T1.JSON_DATA, '$' COLUMNS
(
CLASSID INTEGER PATH '$.ClassId',
ATRB_ID INTEGER PATH '$.Attributes.ID',
HREF INTEGER PATH '$.Attributes.HREF',
HPRECISION INTEGER PATH '$.Attributes.HPRECISION',
HMETHOD INTEGER PATH '$.Attributes.HMETHOD',
GEOMETHOD INTEGER PATH '$.Attributes."GEO-METHOD"',
GEOPRECISION INTEGER PATH '$.Attributes."GEO-PRECISION"',
GEOVISIBILITY INTEGER PATH '$.Attributes."GEO-VISIBILITY"'
)
)
但是,如果您 JSON 仅采用这种格式:
{"ClassId":32000,"Attributes":
[
{"Name":"ID","Value":"4548"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}
因此,我们可以编写查询:
SELECT CLASSID, ATRB_ID, HREF, HPRECISION, HMETHOD, GEOMETHOD, GEOPRECISION, GEOVISIBILITY
FROM TABLE1 T1
CROSS JOIN
JSON_TABLE(T1.JSON_DATA, '$[*]' COLUMNS
(
CLASSID INTEGER PATH '$.ClassId',
ATRB_ID VARCHAR2(100) PATH '$.Attributes[0]."Value"',
HREF VARCHAR2(100) PATH '$.Attributes[1]."Value"',
HPRECISION VARCHAR2(100) PATH '$.Attributes[2]."Value"',
HMETHOD VARCHAR2(100) PATH '$.Attributes[3]."Value"',
GEOMETHOD VARCHAR2(100) PATH '$.Attributes[4]."Value"',
GEOPRECISION VARCHAR2(100) PATH '$.Attributes[5]."Value"',
GEOVISIBILITY VARCHAR2(100) PATH '$.Attributes[6]."Value"'
)
)
结果将是:
CLASSID | ATRB_ID | HREF | HPRECISION | HMETHOD | GEOMETHOD | GEOPRECISION | GEOVISIBILITY |
---|---|---|---|---|---|---|---|
32000 | 4548 | -1 | 5 | 96 | 96 | 5 | 0 |
30074 | 265794 | -1 | 5 | 100 | 90 | 5 | 0 |
执行此查询,执行成功:
SELECT * FROM
JSON_TABLE('{"ClassId":32000,"Attributes":
[
{"Name":"ID","Value":"4548"},
{"Name":"HREF","Value":"-1"},
{"Name":"HPRECISION","Value":"5"},
{"Name":"HMETHOD","Value":"96"},
{"Name":"GEO-METHOD","Value":"96"},
{"Name":"GEO-PRECISION","Value":"5"},
{"Name":"GEO-VISIBILITY","Value":"0"}
]
}', '$[*]' COLUMNS
(
CLASSID INTEGER PATH '$.ClassId',
ATRB_ID VARCHAR2(100) PATH '$.Attributes[0]."Value"',
HREF VARCHAR2(100) PATH '$.Attributes[1]."Value"',
HPRECISION VARCHAR2(100) PATH '$.Attributes[2]."Value"',
HMETHOD VARCHAR2(100) PATH '$.Attributes[3]."Value"',
GEOMETHOD VARCHAR2(100) PATH '$.Attributes[4]."Value"',
GEOPRECISION VARCHAR2(100) PATH '$.Attributes[5]."Value"',
GEOVISIBILITY VARCHAR2(100) PATH '$.Attributes[6]."Value"'
)
)