Skip to main content

半结构化函数(Semi-Structured Functions)

本节提供 Databend 中半结构化数据函数的参考信息。这些函数可帮助您高效处理 JSON 及其他半结构化数据格式。

解析和验证

函数描述示例
PARSE_JSON将 JSON 字符串解析为 Variant 类型值PARSE_JSON('{"name":"Databend"}')
CHECK_JSON验证字符串是否为有效 JSONCHECK_JSON('{"name":"Databend"}')true

对象访问和提取

函数描述示例
GET通过键名从 JSON 对象获取值GET(parse_json('{"name":"Databend"}'), 'name')'Databend'
GET_PATH通过路径从 JSON 对象获取值GET_PATH(parse_json('{"user":{"name":"Databend"}}'), 'user.name')'Databend'
GET_IGNORE_CASE通过不区分大小写的键名获取值GET_IGNORE_CASE(parse_json('{"Name":"Databend"}'), 'name')'Databend'
OBJECT_KEYS返回 JSON 对象的键名集合OBJECT_KEYS(parse_json('{"a":1,"b":2}'))['a', 'b']
JSON_OBJECT_KEYS以数组形式返回 JSON 对象的键名JSON_OBJECT_KEYS(parse_json('{"a":1,"b":2}'))['a', 'b']

类型检查和转换

函数描述示例
JSON_TYPEOF返回 JSON 值的类型JSON_TYPEOF(parse_json('123'))'number'
AS_TYPE将 JSON 值转换为指定 SQL 类型AS_TYPE(parse_json('123'), 'INT')123
JSON_TO_STRING将 JSON 值转换为字符串JSON_TO_STRING(parse_json('{"a":1}'))'{"a":1}'
IS_OBJECT检查 JSON 值是否为对象IS_OBJECT(parse_json('{"a":1}'))true
IS_ARRAY检查 JSON 值是否为数组IS_ARRAY(parse_json('[1,2,3]'))true
IS_STRING检查 JSON 值是否为字符串IS_STRING(parse_json('"hello"'))true
IS_INTEGER检查 JSON 值是否为整数IS_INTEGER(parse_json('123'))true
IS_FLOAT检查 JSON 值是否为浮点数IS_FLOAT(parse_json('123.45'))true
IS_BOOLEAN检查 JSON 值是否为布尔值IS_BOOLEAN(parse_json('true'))true
IS_NULL_VALUE检查 JSON 值是否为 nullIS_NULL_VALUE(parse_json('null'))true

JSON 对象操作

函数描述示例
JSON_OBJECT根据键值对创建 JSON 对象JSON_OBJECT('name', 'Databend', 'version', '1.0')'{"name":"Databend","version":"1.0"}'
JSON_OBJECT_INSERT向 JSON 对象插入键值对JSON_OBJECT_INSERT(parse_json('{"a":1}'), 'b', 2)'{"a":1,"b":2}'
JSON_OBJECT_DELETE从 JSON 对象删除指定键JSON_OBJECT_DELETE(parse_json('{"a":1,"b":2}'), 'b')'{"a":1}'
JSON_OBJECT_PICK选取指定键创建新 JSON 对象JSON_OBJECT_PICK(parse_json('{"a":1,"b":2,"c":3}'), 'a', 'c')'{"a":1,"c":3}'
JSON_STRIP_NULLS移除 JSON 对象中的 null 值JSON_STRIP_NULLS(parse_json('{"a":1,"b":null}'))'{"a":1}'
JSON_OBJECT_KEEP_NULL创建保留 null 值的 JSON 对象JSON_OBJECT_KEEP_NULL('a', 1, 'b', NULL)'{"a":1,"b":null}'

JSON 数组操作

函数描述示例
JSON_ARRAY根据输入值创建 JSON 数组JSON_ARRAY(1, 'text', true)'[1,"text",true]'
JSON_ARRAY_INSERT向 JSON 数组指定位置插入值JSON_ARRAY_INSERT(parse_json('[1,3]'), 1, 2)'[1,2,3]'
JSON_ARRAY_DISTINCT返回去重后的数组JSON_ARRAY_DISTINCT(parse_json('[1,2,1,3,2]'))'[1,2,3]'
FLATTEN将嵌套数组展平为一维数组FLATTEN(parse_json('[[1,2],[3,4]]'))'[1,2,3,4]'

路径查询

函数描述示例
JSON_PATH_EXISTS检查 JSON 路径是否存在JSON_PATH_EXISTS(parse_json('{"a":{"b":1}}'), '$.a.b')true
JSON_PATH_QUERY使用路径表达式查询 JSON 数据JSON_PATH_QUERY(parse_json('{"a":[1,2,3]}'), '$.a[*]')[1,2,3]
JSON_PATH_QUERY_FIRST返回路径查询的首个匹配结果JSON_PATH_QUERY_FIRST(parse_json('{"a":[1,2,3]}'), '$.a[*]')1
JSON_PATH_QUERY_ARRAY以 JSON 数组返回路径查询结果JSON_PATH_QUERY_ARRAY(parse_json('{"a":[1,2,3]}'), '$.a[*]')'[1,2,3]'
JSON_EXTRACT_PATH_TEXT提取 JSON 路径对应的文本值JSON_EXTRACT_PATH_TEXT(parse_json('{"a":{"b":"text"}}'), 'a', 'b')'text'
JSON_PATH_MATCH检查 JSON 数据是否匹配路径表达式JSON_PATH_MATCH(parse_json('{"a":1}'), '$.a == 1')true
JQ提供类 jq 的 JSON 处理能力JQ(parse_json('{"a":{"b":1}}'), '.a.b')1

数组转换

函数描述示例
JSON_ARRAY_MAP对数组元素执行映射操作JSON_ARRAY_MAP(parse_json('[1,2,3]'), x -> x * 2)'[2,4,6]'
JSON_ARRAY_FILTER按条件过滤数组元素JSON_ARRAY_FILTER(parse_json('[1,2,3,4]'), x -> x > 2)'[3,4]'
JSON_ARRAY_TRANSFORM使用表达式转换数组元素JSON_ARRAY_TRANSFORM(parse_json('[{"a":1},{"a":2}]'), x -> x.a)'[1,2]'
JSON_ARRAY_APPLY对数组元素应用函数JSON_ARRAY_APPLY(parse_json('[1,2,3]'), x -> x * x)'[1,4,9]'
JSON_ARRAY_REDUCE将数组归约为单个值JSON_ARRAY_REDUCE(parse_json('[1,2,3]'), 0, (acc, x) -> acc + x)6

集合操作

函数描述示例
JSON_ARRAY_INTERSECTION返回数组之间的交集元素JSON_ARRAY_INTERSECTION(parse_json('[1,2,3]'), parse_json('[2,3,4]'))'[2,3]'
JSON_ARRAY_EXCEPT返回仅存在于第一个数组的元素JSON_ARRAY_EXCEPT(parse_json('[1,2,3]'), parse_json('[2,3,4]'))'[1]'
JSON_ARRAY_OVERLAP检查数组是否存在交集元素JSON_ARRAY_OVERLAP(parse_json('[1,2,3]'), parse_json('[3,4,5]'))true

对象转换

函数描述示例
JSON_MAP_FILTER按条件过滤 JSON 对象的键值对JSON_MAP_FILTER(parse_json('{"a":1,"b":2}'), (k,v) -> v > 1)'{"b":2}'
JSON_MAP_TRANSFORM_KEYS转换 JSON 对象的键名JSON_MAP_TRANSFORM_KEYS(parse_json('{"a":1,"b":2}'), k -> UPPER(k))'{"A":1,"B":2}'
JSON_MAP_TRANSFORM_VALUES转换 JSON 对象的值JSON_MAP_TRANSFORM_VALUES(parse_json('{"a":1,"b":2}'), v -> v * 10)'{"a":10,"b":20}'

展开和格式化

函数描述示例
JSON_ARRAY_ELEMENTS将 JSON 数组展开为多行记录SELECT * FROM JSON_ARRAY_ELEMENTS(parse_json('[1,2,3]'))3 行记录,值分别为 1, 2, 3
JSON_EACH将 JSON 对象展开为键值对记录SELECT * FROM JSON_EACH(parse_json('{"a":1,"b":2}'))2 行键值对记录
JSON_PRETTY格式化 JSON 输出(含缩进)JSON_PRETTY(parse_json('{"a":1,"b":2}'))'{\n "a": 1,\n "b": 2\n}'