JSON_VAL

JSON_VAL 函数提供了一个 SQL 接口,用于从 BSON 对象中抽取 JSON 数据并将其检索到 SQL 数据类型中。 JSON_VAL 函数返回 JSON 文档的元素,该元素由在 search-string 中指定的 JSON 字段名称标识。 JSON 元素的值以结果类型中指定的数据类型和长度返回。

Read syntax diagramSkip visual syntax diagram JSON_VAL ( json-value , search-string , return-type )

该模式是 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 记录返回数据类型,因此需要指定格式。 可能的格式为:
表 1. result-type 值的数据类型规范。
返回类型 格式
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-字段不存在
    在 JSON_EMP 表中,有少数员工没有中间名。 根据记录的中间名是否存在,以下查询将返回值 1 , 0 或 NULL。
    SELECT JSON_VAL(EMP_DATA,'lastname','s:30'),
           JSON_VAL(EMP_DATA,'midinit','u')
    FROM JSON_EMP;