JSON 函数概述
StarRocks 支持如下 JSON 构造函数、JSON 查询和处理函数、JSON 运算符以及查询 JSON 对象的 JSON Path。
JSON 构造函数
JSON 构造函数可以构造 JSON 类型的数据。例如 JSON 类型的对象、JSON 类型的数组等。
函数名称 | 功能 | 示例 | 返回结果 |
---|---|---|---|
json_object | 构造 JSON 类型的对象。 | SELECT JSON_OBJECT('Daniel Smith', 26, 'Lily Smith', 25); | {"Daniel Smith": 26, "Lily Smith": 25} |
json_array | 构造 JSON 类型的数组。 | SELECT JSON_ARRAY(1, 2, 3); | [1,2,3] |
parse_json | 从字符串解析并构造出 JSON 类型的数据。 | SELECT PARSE_JSON('{"a": 1}'); | {"a": 1} |
JSON 查询和处理函数
JSON 查询和处理函数可以查询和处理 JSON 类型的数据。例如查询 JSON 对象中指定路径下的值。
函数名称 | 功能 | 示例 | 返回结果 |
---|---|---|---|
箭头函数 | 查询 JSON 对象中指定路径下的值。 | SELECT parse_json('{"a": {"b": 1}}') -> '$.a.b'; | 1 |
JSON 类型转换 | 将实现 JSON 类型的数据与 SQL 类型间的互相转换。 | SELECT CAST(1 AS JSON); | 1 |
get_json_double | 解析并获取 json_str 内 json_path 的浮点型内容。 | SELECT get_json_double('{"k1":1.3, "k2":"2"}', "$.k1"); | 1.3 |
get_json_int | 解析并获取 json_str 内 json_path 的整型内容。 | SELECT get_json_int('{"k1":1, "k2":"2"}', "$.k1"); | 1 |
get_json_string | 解析并获取 json_str 内 json_path 指定的字符串。该函数别名为 get_json_object. | SELECT get_json_string('{"k1":"v1", "k2":"v2"}', "$.k1"); | v1 |
json_each | 将最外层的 JSON 对象展开为键值对。 | SELECT * FROM tj_test, LATERAL JSON_EACH(j); | |
json_exists | 查询 JSON 对象中是否存在某个值。如果存在,则 返回 1;如果不存在,则返回 0。 | SELECT JSON_EXISTS('{"a": 1}', '$.a'); | 1 |
json_keys | 返回 JSON 对象中所有最上层成员 (key) 组成的数组。 | SELECT JSON_KEYS('{"a": 1, "b": 2, "c": 3}'); | ["a", "b", "c"] |
json_length | 返回 JSON 字符串的长度。 | SELECT json_length('{"Name": "Alice"}'); | 1 |
json_query | 查询 JSON 对象中指定路径下的值。 | SELECT JSON_QUERY('{"a": 1}', '$.a'); | 1 |
json_string | 将 JSON 对象转化为 JSON 字符串。 | SELECT json_string(parse_json('{"Name": "Alice"}')); | {"Name": "Alice"} |
JSON 运算符
StarRocks 支持使用 <
,<=
,>
,>=
, =
,!=
运算符查询 JSON 数据,不支持使用 IN 运算符。JSON 运算符的更多说明,请参见 JSON 运算符。
JSON Path
您可以使用 JSON Path 路径表达式,查询 JSON 类型的对象中指定路径的值。JSON Path 为字符串类型,一般结合多种 JSON 函数使用(例如 JSON_QUERY)。目前 StarRocks 中 JSON Path 没有完全遵循 SQL/JSONPath 标准。StarRocks 中 JSON Path 语法说明,参见下表(以如下 JSON object 为例)。
{
"people": [{
"name": "Daniel",
"surname": "Smith"
}, {
"name": "Lily",
"surname": "Smith",
"active": true
}]
}
JSON Path 的符号 | 说明 | JSON Path 示例 | 查询上述 JSON 对象的值 |
---|---|---|---|
$ | 表示根节点的对象。 | '$' | { "people": [ { "name": "Daniel", "surname": "Smith" }, { "name": "Lily", "surname": Smith, "active": true } ] } |
. | 表示子节点。 | ' $.people' | [ { "name": "Daniel", "surname": "Smith" }, { "name": "Lily", "surname": Smith, "active": true } ] |
[] | 表示一个或多个数组下标。[n] 表示选择数组中第 n 个元素,从 0 开始计数。 从 2.5 版本开始支持查询多维数组,例如 ["Lucy", "Daniel"], ["James", "Smith"]。如果要查询到 "Lucy"这个元素,可以使用路径 $.people[0][0] 。 | '$.people[0]' | { "name": "Daniel", "surname": "Smith"} |
[*] | 表示数组中的全部元素。 | '$.people[*].name' | ["Daniel", "Lily"] |
[start: end] | 表示数组片段,区间为 [start, end),不包含 end 代表的元素。 | '$.people[0: 1].name' | ["Daniel"] |