【问题标题】:Oracle 12C - JSON_TABLE - How to return other columns in the table when json column is nullOracle 12C - JSON_TABLE - 当 json 列为空时如何返回表中的其他列
【发布时间】:2020-11-30 04:02:40
【问题描述】:

有一个表有一个 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 列为空时,我们如何检索表中其他列的数据?

我尝试了 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 为查询返回以下输出:

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 版

【问题讨论】:

  • 我想知道您是否为每个名称、地址值插入相同的 JSON 值?
  • 不同的名字可以相同也可以不同。但想法是检索没有 JSON 数据的名称。

标签: sql json oracle oracle12c


【解决方案1】:

TableA、TableB 的语法是笛卡尔积的旧语法,所以每个表都必须返回至少 1 行,但是由于第二个表是从第一个表派生的,所以有点奇怪,试试 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

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2020-04-24
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多