简体   繁体   English

Oracle 12C - JSON_TABLE - 当 json 列为 null 时如何返回表中的其他列

[英]Oracle 12C - JSON_TABLE - How to return other columns in the table when json column is null

There is a table which has a CLOB JSON column:有一个表有一个 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 is a HUGECLOB which has JSON data of the below format: 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"
        }
    }]
}

I'm using JSON_TABLE to get data from PAYMENT_JS column and other columns in the table:我正在使用 JSON_TABLE 从 PAYMENT_JS 列和表中的其他列获取数据:

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

But when the PAYMENT_JS column doesn't have data, those rows' NAME and ADDRESS are also not getting retrieved.但是当 PAYMENT_JS 列没有数据时,这些行的 NAME 和 ADDRESS 也不会被检索到。

How do we retrieve data for other columns in the table when the JSON column is empty?当 JSON 列为空时,我们如何检索表中其他列的数据?

I tried NULL ON EMPTY but doesnt work:我在 EMPTY 上尝试了 NULL 但不起作用:

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 

My output should look like this:我的 output 应该是这样的:

stud_name, stud_address,code
-----------------------------
Maria, 1 Avenue NY,OTHER
David, 2 Avenue NY,COST_OF_STUDY
Kavya, 3 Avenue NY

Here, the JSON column is empty for Kavya.在这里,Kavya 的 JSON 列是空的。

But Oracle returns the below output for the query:但是 Oracle 为查询返回以下 output :

stud_name, stud_address,code
-----------------------------
Maria, 1 Avenue NY,OTHER
David, 2 Avenue NY,COST_OF_STUDY

I'm using Oracle Database 12c Enterprise Edition Release 12.2.0.1.0我正在使用 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0

TableA, TableB syntax is old syntax for cartesian products, so every table must return at least 1 row, but since the second table is derived from the first one, it's a little bit odd, try with left join TableA、TableB 语法是笛卡尔积的旧语法,所以每个表必须至少返回 1 行,但是由于第二个表是从第一个表派生的,所以有点奇怪,请尝试使用左连接

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM