JSON_VAL
JSON_VAL 函数提供了一个 SQL 接口,用于从 BSON 对象中抽取 JSON 数据并将其检索到 SQL 数据类型中。 JSON_VAL 函数返回 JSON 文档的元素,该元素由在 search-string 中指定的 JSON 字段名称标识。 JSON 元素的值以结果类型中指定的数据类型和长度返回。
该模式是 SYSIBM。
- json-value
- 基本表的 BLOB 列。 json-value 值必须包含 JSON 文档的 BSON 表示。
- 搜索字符串
- 路径限定的 JSON 字段名称。
- 返回类型
- 返回的数据的返回类型。
搜索字符串和返回类型必须是常量,它们不能是变量。 因此,它们在用户定义函数中的使用仅限于常量。
典型 JSON 记录包含各种数据类型和结构,如以下记录所示:
{
"empno":"200170",
"firstnme":"KIYOSHI",
"midinit":"",
"lastname":"YAMAMOTO",
"workdept":"D11",
"phoneno":[2890],
"hiredate":"09/15/2005",
"job":"DESIGNER",
"edlevel":16,
"sex":"M",
"birthdate":"01/05/1981",
"pay":{
"salary":64680.00,
"bonus":500.00,
"comm":1974.00
}
}存在具有不同格式的字段数,包括字符串 (firstnme) ,整数 (edlevel) ,小数 (salary) ,日期 (hiredate) ,数字数组 (phoneno) 和结构 (pay)。 JSON 数据可以由嵌套对象,数组和复杂结构组成。 使用 JSON2BSON 函数时,将检查 JSON 对象的格式,如果该对象不符合 JSON 规范,那么将发出错误消息。JSON_VAL 函数需要知道如何从 JSON 记录返回数据类型,因此需要指定格式。 可能的格式为:
| 返回类型 | 格式 |
|---|---|
| n | DECFLOAT |
| i | INTEGER |
| l | BIGINT (请注意小写字母 L) |
| f | 双 |
| d | DATE |
| 效益 | TIMESTAMP (6) |
| t | TIME |
| s: n | VARCHAR (n) ,其中 n 是整数常量 1-32672 |
| b: n | VARBINARY (n) ,其中 n 是整数常量 1-32672 |
| u | 值为 0 或 1 的空标志 (整数) |
示例
- 示例 1: 以下示例检索员工编号为 "200170" 的员工的姓氏:
从数组类型中选择数据将为您提供第一个值 (元素零)。 如果需要访问字段中的特定数组元素,那么可以在字段名后使用点表示法。 第一个元素从零开始。 如果选择第二个元素SELECT JSON_VAL(EMP_DATA,'lastname','s:20') FROM JSON_EMP WHERE JSON_VAL(EMP_DATA,'empno','s:6') = '200170';(.1),那么具有第二个元素的所有记录将检索其值,而不具有空值的记录将检索其值。 - 示例 2: 通过使用与数组相同的点表示法来检索结构化字段。 该字段是使用
field.subfield格式指定的,并且这些字段可以是任意数量的深度级别。 员工记录中的薪酬字段由另外三个字段组成:
要检索这三个字段,您需要对它们进行显式命名,因为仅检索付费不起作用。"pay":{ "salary":64680.00, "bonus":500.00, "comm":1974.00 }SELECT JSON_VAL(EMP_DATA,'pay.salary','i'), JSON_VAL(EMP_DATA,'pay.bonus','i'), JSON_VAL(EMP_DATA,'pay.comm','i') FROM JSON_EMP WHERE JSON_VAL(EMP_DATA,'empno','s:6') = '200170';"u" 标志用于确定字段中是否有任何内容。 如果使用 "u" 标志,那么返回的值将为:- 1-该字段存在,并且它具有值 (非 null 或空字符串)
- 0-该字段存在,但值为 NULL 或空
- null-字段不存在
SELECT JSON_VAL(EMP_DATA,'lastname','s:30'), JSON_VAL(EMP_DATA,'midinit','u') FROM JSON_EMP;
