Oracle 12C - JSON_TABLE - 当 json 列为空时如何 return table 中的其他列
Oracle 12C - JSON_TABLE - How to return other columns in the table when json column is null
有一个 table 有一个 CLOB JSON 列:
CREATE TABLE STUDENT
(
NAME VARCHAR2(32 BYTE),
ADDRESS VARCHAR2(30 BYTE),
PAYMENT_JS CLOB
);
ALTER TABLE STUDENT ADD
CONSTRAINT CK_PAYMENT_JS
CHECK ("PAYMENT_JS" IS JSON (LAX));
PAYMENT_JS 是一个 HUGECLOB,它有 JSON 以下格式的数据:
{
"pays": [{
"payCode": {
"code": "OTHER"
},
"payValue": {
"amount": 0.0,
"currencyCode": "USD"
}
},
{
"payCode": {
"code": "COST_OF_STUDY"
},
"payValue": {
"amount": 2395.29,
"currencyCode": "USD"
}
}]
}
我正在使用 JSON_TABLE 从 PAYMENT_JS 列和 table 中的其他列获取数据:
select
e.name AS stud_name,
e.address AS stud_address,
j.code
FROM
STUDENT e,
JSON_TABLE ( payment_js,'$.pays[*]'
COLUMNS (
code VARCHAR2 ( 100 CHAR ) PATH '$.payCode.code' ,
amount NUMBER ( 10,2 ) PATH '$.payValue.amount' ,
currencycode VARCHAR2 ( 4 CHAR ) PATH '$.payValue.currencyCode'
)
)
j
但是当 PAYMENT_JS 列没有数据时,也不会检索这些行的名称和地址。
当 JSON 列为空时,我们如何检索 table 中其他列的数据?
我试过 NULL ON EMPTY 但没有用:
select
e.name AS stud_name,
e.address AS stud_address,
j.code
FROM
STUDENT e,
JSON_TABLE ( payment_js,'$.pays[*]'
COLUMNS (
code VARCHAR2 ( 100 CHAR ) PATH '$.payCode.code' NULL ON EMPTY,
amount NUMBER ( 10,2 ) PATH '$.payValue.amount' NULL ON EMPTY,
currencycode VARCHAR2 ( 4 CHAR ) PATH '$.payValue.currencyCode' NULL ON EMPTY
)
)
j
我的输出应该是这样的:
stud_name, stud_address,code
-----------------------------
Maria, 1 Avenue NY,OTHER
David, 2 Avenue NY,COST_OF_STUDY
Kavya, 3 Avenue NY
此处,Kavya 的 JSON 列为空。
但是 Oracle returns 查询的以下输出:
stud_name, stud_address,code
-----------------------------
Maria, 1 Avenue NY,OTHER
David, 2 Avenue NY,COST_OF_STUDY
我正在使用 Oracle Database 12c 企业版 12.2.0.1.0 版
TableA, TableB 语法是笛卡尔乘积的旧语法,因此每个 table 必须 return 至少 1 行,但由于第二个 table 是从第一个导出的,有点奇怪,尝试使用 left join
select
e.name AS stud_name,
e.address AS stud_address,
j.code
FROM
STUDENT e
left join (
JSON_TABLE ( payment_js,'$.pays[*]'
COLUMNS (
code VARCHAR2 ( 100 CHAR ) PATH '$.payCode.code' NULL ON EMPTY,
amount NUMBER ( 10,2 ) PATH '$.payValue.amount' NULL ON EMPTY,
currencycode VARCHAR2 ( 4 CHAR ) PATH '$.payValue.currencyCode' NULL ON EMPTY
)
) j
on 1 = 1
有一个 table 有一个 CLOB JSON 列:
CREATE TABLE STUDENT
(
NAME VARCHAR2(32 BYTE),
ADDRESS VARCHAR2(30 BYTE),
PAYMENT_JS CLOB
);
ALTER TABLE STUDENT ADD
CONSTRAINT CK_PAYMENT_JS
CHECK ("PAYMENT_JS" IS JSON (LAX));
PAYMENT_JS 是一个 HUGECLOB,它有 JSON 以下格式的数据:
{
"pays": [{
"payCode": {
"code": "OTHER"
},
"payValue": {
"amount": 0.0,
"currencyCode": "USD"
}
},
{
"payCode": {
"code": "COST_OF_STUDY"
},
"payValue": {
"amount": 2395.29,
"currencyCode": "USD"
}
}]
}
我正在使用 JSON_TABLE 从 PAYMENT_JS 列和 table 中的其他列获取数据:
select
e.name AS stud_name,
e.address AS stud_address,
j.code
FROM
STUDENT e,
JSON_TABLE ( payment_js,'$.pays[*]'
COLUMNS (
code VARCHAR2 ( 100 CHAR ) PATH '$.payCode.code' ,
amount NUMBER ( 10,2 ) PATH '$.payValue.amount' ,
currencycode VARCHAR2 ( 4 CHAR ) PATH '$.payValue.currencyCode'
)
)
j
但是当 PAYMENT_JS 列没有数据时,也不会检索这些行的名称和地址。
当 JSON 列为空时,我们如何检索 table 中其他列的数据?
我试过 NULL ON EMPTY 但没有用:
select
e.name AS stud_name,
e.address AS stud_address,
j.code
FROM
STUDENT e,
JSON_TABLE ( payment_js,'$.pays[*]'
COLUMNS (
code VARCHAR2 ( 100 CHAR ) PATH '$.payCode.code' NULL ON EMPTY,
amount NUMBER ( 10,2 ) PATH '$.payValue.amount' NULL ON EMPTY,
currencycode VARCHAR2 ( 4 CHAR ) PATH '$.payValue.currencyCode' NULL ON EMPTY
)
)
j
我的输出应该是这样的:
stud_name, stud_address,code
-----------------------------
Maria, 1 Avenue NY,OTHER
David, 2 Avenue NY,COST_OF_STUDY
Kavya, 3 Avenue NY
此处,Kavya 的 JSON 列为空。
但是 Oracle returns 查询的以下输出:
stud_name, stud_address,code
-----------------------------
Maria, 1 Avenue NY,OTHER
David, 2 Avenue NY,COST_OF_STUDY
我正在使用 Oracle Database 12c 企业版 12.2.0.1.0 版
TableA, TableB 语法是笛卡尔乘积的旧语法,因此每个 table 必须 return 至少 1 行,但由于第二个 table 是从第一个导出的,有点奇怪,尝试使用 left join
select
e.name AS stud_name,
e.address AS stud_address,
j.code
FROM
STUDENT e
left join (
JSON_TABLE ( payment_js,'$.pays[*]'
COLUMNS (
code VARCHAR2 ( 100 CHAR ) PATH '$.payCode.code' NULL ON EMPTY,
amount NUMBER ( 10,2 ) PATH '$.payValue.amount' NULL ON EMPTY,
currencycode VARCHAR2 ( 4 CHAR ) PATH '$.payValue.currencyCode' NULL ON EMPTY
)
) j
on 1 = 1