簡體   English   中英

Oracle 12C - JSON_TABLE - 當 json 列為 null 時如何返回表中的其他列

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

有一個表有一個 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 列和表中的其他列獲取數據:

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 列沒有數據時,這些行的 NAME 和 ADDRESS 也不會被檢索到。

當 JSON 列為空時,我們如何檢索表中其他列的數據?

我在 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 

我的 output 應該是這樣的:

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

在這里,Kavya 的 JSON 列是空的。

但是 Oracle 為查詢返回以下 output :

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

我正在使用 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0

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