Oracle 的 JSON_TABLE 函数用于将 JSON 数据转换为关系表结构,使得可以像查询普通 SQL 表一样查询 JSON 数据。它将 JSON 数组中的每个对象映射为一行,JSON 对象中的字段映射为列‌。
基本语法
SELECT * FROM JSON_TABLE(
  json_document,
  json_path
  COLUMNS (
    column_definition_list
  )
) AS alias;

参数说明:

    ‌json_document‌:要解析的 JSON 数据,可以是字符串、VARCHAR2、CLOB 或 BLOB 类型的列。如果该列是 BLOB 类型,则必须使用 FORMAT JSON 子句。
    ‌json_path‌:指定 JSON 数据中要处理的部分的路径表达式。例如,'$' 表示整个 JSON 文档,'$.employees[*]' 表示数组中的所有元素。
    ‌COLUMNS‌:定义输出列的列表。每列可以指定名称、数据类型、路径表达式等‌。

列定义语法

在 COLUMNS 子句中,每列可以使用以下几种形式之一定义:

    ‌普通列‌:column_name data_type PATH path_literal
        示例:name VARCHAR2(50) PATH '$.name'
    ‌返回 JSON 格式的数据‌:column_name data_type FORMAT JSON PATH path_literal
        示例:phones VARCHAR2(100) FORMAT JSON PATH '$.phones'
    ‌使用 EXISTS 检查是否存在某个字段‌:column_name data_type EXISTS PATH path_literal
        示例:has_address BOOLEAN EXISTS PATH '$.address'
    ‌使用 FOR ORDINALITY‌:生成一个序号列,用于标识每行的顺序。
        示例:row_num FOR ORDINALITY

示例

假设有一个包含 JSON 数据的表 emp,其结构如下:
CREATE TABLE emp (
  jsondoc VARCHAR2(32000)
);

插入如下数据:
{
  "id": 901,
  "name": {
    "first": "John",
    "last": "Doe"
  },
  "office": "E-334",
  "phones": [
    {
      "type": "home",
      "number": "555-3762"
    },
    {
      "type": "work",
      "number": "555-7242"
    }
  ]
}

可以使用 JSON_TABLE 来提取这些数据:
SELECT t.first, t.last, t.office
FROM emp,
JSON_TABLE(
  emp.jsondoc,
  'lax $'
  COLUMNS (
    first VARCHAR2(10) PATH 'lax $.name.first',
    last VARCHAR2(10) PATH 'lax $.name.last',
    office VARCHAR2(10) PATH 'lax $.office'
  )
) AS t;

此查询会返回如下结果:
表格
FIRST     LAST     OFFICE
John     Doe     E-334
错误处理

默认情况下,如果 JSON 数据不符合预期格式,JSON_TABLE 会返回空值。可以通过添加 ON ERROR 或 NULL ON ERROR 子句来控制错误处理行为。
性能优化

在某些情况下,JSON_TABLE 可以与物化视图结合使用以提高查询性能。此外,Oracle 数据库优化器可能会自动将多个 JSON_EXISTS、JSON_VALUE 或 JSON_QUERY 调用重写为单个 JSON_TABLE 调用。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐