JSON_TABLE
JSON_TABLE 表函数返回计算 SQL/JSON 路径表达式的结果表。 行 SQL/JSON path expression 的结果序列中的每一项都表示结果表中的一行或多行。
- JSON 表达式
- 指定返回字符,图形或二进制字符串值的表达式。 如果返回字符或图形值,那么它必须包含格式正确的 JSON 对象。 如果返回二进制值,那么它必须包含 JSON 对象的 BSON 表示。
- FORMAT JSON 或 FORMAT BSON
- 指定如何解释 JSON-expression 。
- 格式 JSON
- 指示 JSON-expression 包含 JSON 数据。 如果 JSON-expression 是二进制数据,那么会将数据解释为 UTF-8 或 UTF-16。 不能使用 EBCDIC CCSID 对二进制数据进行编码。
- 格式 Bson
- 指示 JSON-expression 包含 JSON 数据的 BSON 表示。 指定 FORMAT BSON 时, JSON-expression 必须是二进制字符串数据类型。
- sql-json-path-expression
- 指定解释为 SQL/JSON 路径表达式的字符或图形字符串表达式。 必须以小写形式指定 sql-json-path-expression 中的关键字。 此表达式返回一个输出序列,其中序列中的每个项都由列定义用于在输出表中生成一行或多行。 如果输出序列为空,那么 JSON_TABLE 的结果为空表。 sql-json-path-expression 不能是空字符串或全部为空白的字符串。
- AS 路径名
- 指定用于标识 sql-json-path-expression的名称。
- EMPTY ON ERROR 或 ERROR ON ERROR
- 指定迂到表级别错误时 JSON_TABLE 的期望行为。
- EMPTY ON 错误
- 迂到表级别错误时,将返回空表。 这是缺省情况。
- 错误开启错误
- 迂到表级别错误时,将返回错误。
- 列
- 指定结果表的输出列,包括列名,数据类型以及如何计算每行的列值。
| JSON 类型 | SQL 类型 | 注意 |
|---|---|---|
| 编号 | SMALLINT
整数 BIGINT |
如果源值超出目标数据类型的范围,那么将返回溢出错误。 |
| 编号 | 十进制
NUMERIC |
如果需要,会将生成的数字值转换为目标数据类型的精度和小数位。 添加或除去必需的前导零数。 在数字的小数部分中,添加了必需的尾数零或消除了必需的位数。 此截断行为类似于从 DECIMAL 到 DECIMAL 的强制类型转换行为。 |
| 编号 | 浮点
DOUBLE REAL DECFLOAT |
如果源值超出目标数据类型的范围,那么将返回溢出错误。 如果源值包含比目标数据类型的精度更重要的数字,那么会将源值舍入为目标数据类型的精度。 |
| 字符串或数字 | char
varchar clob graphic vargraphic dbclob |
必要时,会使用 分配的转换规则 中描述的规则将生成的值转换为目标数据类型的 CCSID ,然后再将其转换为长度有限的目标类型。 如果指定的长度限制小于 CCSID 转换后生成的字符串的长度,那么将发生截断。 如果任何非空白字符被截断,那么会发生警告。 如果目标类型是固定长度的字符串 (CHAR 或 GRAPHIC) ,并且目标类型的指定长度大于 CCSID 转换生成的字符串的长度,那么将在末尾填充空白。 这种截断和填充行为类似于字符或图形字符串的检索分配。 |
字符串或数字![]() |
BOOLEAN![]() |
生成的值将按照 布尔赋值中描述的布尔赋值规则转换为布尔值。 ![]() |
| 字符串 | 日期 | JSON 字符串将转换为日期值。 JSON 字符串必须采用下列其中一种格式:
|
| 字符串 | 时间 | JSON 字符串将转换为时间值。 JSON 字符串必须采用下列其中一种格式:
|
| 字符串 | TIMESTAMP | JSON 字符串将转换为时间戳记值。 JSON 字符串必须采用下列其中一种格式:
|
布尔值![]() |
BOOLEAN ![]() |
JSON 布尔值作为布尔值返回。 ![]() |
| 布尔值 | char varchar clob graphic vargraphic dbclob |
JSON 布尔值将转换为 true 或 false 字符串,并使用 JSON 字符串的转换规则作为字符串返回。 |
布尔值![]() |
![]() smallint integer bigint decfloat ![]() |
JSON 布尔值作为数字值 0 (false) 或 1 (true) 返回。![]() |
| 数组或对象 | char
varchar clob graphic vargraphic dbclob |
必须使用 FORMAT JSON 列返回。 JSON 数组或对象作为 JSON 格式的字符串返回。 生成的转换与字符串类型相同。 |
| 空 | 任何 | 将 JSON 空值转换为 SQL 空值 |
示例
这些示例对以下 JSON 文档执行操作:
{
"id" : 901,
"name" : { "first":"John", "last":"Doe" },
"phones": [ { "type":"home", "number":"555-3762"},
{ "type":"work", "number":"555-8792"}]
}- 列出员工标识,名字,姓氏以及第一个电话类型和号码:
返回:SELECT U."id", U."first name",U."last name",U."phone type",U."phone number" FROM EMPLOYEE_TABLE E, JSON_TABLE(E.jsondoc, 'lax $' COLUMNS( "id" INTEGER, "first name" VARCHAR(20) PATH 'lax $.name.first', "last name" VARCHAR(20) PATH 'lax $.name.last', "phone type" VARCHAR(20) PATH 'lax $.phones[0].type', "phone number" VARCHAR(20) PATH 'lax $.phones[0].number') ) AS Uid first name last name phone type phone number --- ---------- --------- ---------- ------------ 901 John Doe home 555-3762 - 列出员工标识,名字,姓氏以及所有可用的电话类型和号码:
返回:SELECT U."id", U."first name",U."last name",U."phone type",U."number" AS "phone number" FROM EMPLOYEE_TABLE E, JSON_TABLE(E.jsondoc, 'lax $' COLUMNS( "id" INTEGER, "first name" VARCHAR(20) PATH 'lax $.name.first', "last name" VARCHAR(20) PATH 'lax $.name.last', NESTED PATH 'lax $.phones[*]' COLUMNS ( "phone type" VARCHAR(20) PATH 'lax $.type', "number" VARCHAR(20) ) ) ) AS Uid first name last name phone type phone number --- ---------- --------- ---------- ------------ 901 John Doe home 555-3762 901 John Doe work 555-8792

字符串或数字