跳到主要内容

结构化与半结构化函数

Databend 中的结构化与半结构化函数能够高效处理数组(Array)、对象(Object)、映射(Map)、JSON 以及其他结构化数据格式。这些函数为创建、解析、查询、转换和操作结构化及半结构化数据提供了全面的能力。

JSON 函数

解析与验证

函数描述示例
PARSE_JSON将 JSON 字符串解析为 VARIANT 值PARSE_JSON('[1,2,3]')
CHECK_JSON验证字符串是否为有效 JSONCHECK_JSON('{"a":1}')
JSON_TYPEOF返回 JSON 值的类型JSON_TYPEOF(PARSE_JSON('[1,2,3]'))

基于路径的查询

函数描述示例
JSON_PATH_EXISTS检查 JSON 路径是否存在JSON_PATH_EXISTS(json_obj, '$.name')
JSON_PATH_QUERY使用 JSONPath 查询 JSON 数据JSON_PATH_QUERY(json_obj, '$.items[*]')
JSON_PATH_QUERY_ARRAY查询 JSON 数据并以数组形式返回结果JSON_PATH_QUERY_ARRAY(json_obj, '$.items')
JSON_PATH_QUERY_FIRST返回 JSON 路径查询的第一个结果JSON_PATH_QUERY_FIRST(json_obj, '$.items[*]')
JSON_PATH_MATCH根据路径模式匹配 JSON 值JSON_PATH_MATCH(json_obj, '$.age')
JQ使用 jq 语法进行高级 JSON 处理JQ('.name', json_obj)

值提取

函数描述示例
GET通过键从 JSON 对象或通过索引从数组中获取值GET(PARSE_JSON('[1,2,3]'), 0)
GET_PATH使用路径表达式从 JSON 对象中获取值GET_PATH(json_obj, 'user.name')
GET_IGNORE_CASE以不区分大小写的键匹配方式获取值GET_IGNORE_CASE(json_obj, 'NAME')
JSON_EXTRACT_PATH_TEXT使用路径从 JSON 中提取文本值JSON_EXTRACT_PATH_TEXT(json_obj, 'name')

转换与输出

函数描述示例
JSON_TO_STRING将 JSON 值转换为字符串JSON_TO_STRING(PARSE_JSON('{"a":1}'))
JSON_PRETTY使用适当缩进格式化 JSONJSON_PRETTY(PARSE_JSON('{"a":1}'))
STRIP_NULL_VALUE从 JSON 中移除 null 值STRIP_NULL_VALUE(PARSE_JSON('{"a":1,"b":null}'))

数组/对象展开

函数描述示例
JSON_EACH将 JSON 对象展开为键值对JSON_EACH(PARSE_JSON('{"a":1,"b":2}'))
JSON_ARRAY_ELEMENTS将 JSON 数组展开为单个元素JSON_ARRAY_ELEMENTS(PARSE_JSON('[1,2,3]'))

数组函数

函数描述示例
ARRAY_CONSTRUCT从单个值创建数组ARRAY_CONSTRUCT(1, 2, 3)
RANGE生成连续数字的数组RANGE(1, 5)
GET通过索引从数组中获取元素GET(PARSE_JSON('[1,2,3]'), 0)
ARRAY_GETGET 函数的别名ARRAY_GET([1,2,3], 1)
CONTAINS检查数组是否包含特定值CONTAINS([1,2,3], 2)
ARRAY_CONTAINS检查数组是否包含特定值ARRAY_CONTAINS([1,2,3], 2)
ARRAY_APPEND将元素追加到数组末尾ARRAY_APPEND([1,2], 3)
ARRAY_PREPEND将元素前插到数组开头ARRAY_PREPEND([2,3], 1)
ARRAY_INSERT在指定位置插入元素ARRAY_INSERT([1,3], 1, 2)
ARRAY_REMOVE移除所有出现的指定元素ARRAY_REMOVE([1,2,2,3], 2)
ARRAY_REMOVE_FIRST从数组中移除第一个元素ARRAY_REMOVE_FIRST([1,2,3])
ARRAY_REMOVE_LAST从数组中移除最后一个元素ARRAY_REMOVE_LAST([1,2,3])
ARRAY_CONCAT连接多个数组ARRAY_CONCAT([1,2], [3,4])
ARRAY_SLICE提取数组的一部分ARRAY_SLICE([1,2,3,4], 1, 2)
SLICEARRAY_SLICE 函数的别名SLICE([1,2,3,4], 1, 2)
ARRAYS_ZIP按元素方式组合多个数组ARRAYS_ZIP([1,2], ['a','b'])
ARRAY_DISTINCT从数组中返回唯一元素ARRAY_DISTINCT([1,2,2,3])
ARRAY_UNIQUEARRAY_DISTINCT 函数的别名ARRAY_UNIQUE([1,2,2,3])
ARRAY_INTERSECTION返回数组之间的共同元素ARRAY_INTERSECTION([1,2,3], [2,3,4])
ARRAY_EXCEPT返回存在于第一个数组但不存在于第二个数组中的元素ARRAY_EXCEPT([1,2,3], [2,3])
ARRAY_OVERLAP检查数组是否有共同元素ARRAY_OVERLAP([1,2], [2,3])
ARRAY_TRANSFORM对每个数组元素应用函数ARRAY_TRANSFORM([1,2,3], x -> x * 2)
ARRAY_FILTER根据条件筛选数组元素ARRAY_FILTER([1,2,3,4], x -> x > 2)
ARRAY_REDUCE使用聚合将数组归约为单个值ARRAY_REDUCE([1,2,3], 0, (acc, x) -> acc + x)
ARRAY_AGGREGATE使用函数聚合数组元素ARRAY_AGGREGATE([1,2,3], 'sum')
ARRAY_COMPACT从数组中移除 null 值ARRAY_COMPACT([1, NULL, 2, NULL, 3])
ARRAY_FLATTEN将嵌套数组展平为单个数组ARRAY_FLATTEN([[1,2], [3,4]])
ARRAY_REVERSE反转数组元素的顺序ARRAY_REVERSE([1,2,3])
ARRAY_INDEXOF返回元素首次出现的索引ARRAY_INDEXOF([1,2,3,2], 2)
UNNEST将数组展开为单独的行UNNEST([1,2,3])

对象函数

函数描述示例
OBJECT_CONSTRUCT从键值对创建 JSON 对象OBJECT_CONSTRUCT('name', 'John', 'age', 30)
OBJECT_CONSTRUCT_KEEP_NULL创建 JSON 对象并保留 null 值OBJECT_CONSTRUCT_KEEP_NULL('a', 1, 'b', NULL)
OBJECT_KEYS以数组形式返回 JSON 对象的所有键OBJECT_KEYS(PARSE_JSON('{"a":1,"b":2}'))
OBJECT_INSERT在 JSON 对象中插入或更新键值对OBJECT_INSERT(json_obj, 'new_key', 'value')
OBJECT_DELETE从 JSON 对象中移除键值对OBJECT_DELETE(json_obj, 'key_to_remove')
OBJECT_PICK使用指定键创建新对象OBJECT_PICK(json_obj, 'name', 'age')

映射函数

函数描述示例
MAP_CAT将多个映射合并为单个映射MAP_CAT({'a':1}, {'b':2})
MAP_KEYS以数组形式返回映射的所有键MAP_KEYS({'a':1, 'b':2})
MAP_VALUES以数组形式返回映射的所有值MAP_VALUES({'a':1, 'b':2})
MAP_SIZE返回映射中键值对的数量MAP_SIZE({'a':1, 'b':2})
MAP_CONTAINS_KEY检查映射是否包含特定键MAP_CONTAINS_KEY({'a':1}, 'a')
MAP_INSERT向映射中插入键值对MAP_INSERT({'a':1}, 'b', 2)
MAP_DELETE从映射中移除键值对MAP_DELETE({'a':1, 'b':2}, 'b')
MAP_TRANSFORM_KEYS对映射中的每个键应用函数MAP_TRANSFORM_KEYS(map, k -> UPPER(k))
MAP_TRANSFORM_VALUES对映射中的每个值应用函数MAP_TRANSFORM_VALUES(map, v -> v * 2)
MAP_FILTER根据谓词筛选键值对MAP_FILTER(map, (k, v) -> v > 10)
MAP_PICK使用指定键创建新映射MAP_PICK({'a':1, 'b':2, 'c':3}, 'a', 'c')

类型转换函数

函数描述示例
AS_BOOLEAN将 VARIANT 值转换为 BOOLEANAS_BOOLEAN(PARSE_JSON('true'))
AS_INTEGER将 VARIANT 值转换为 BIGINTAS_INTEGER(PARSE_JSON('42'))
AS_FLOAT将 VARIANT 值转换为 DOUBLEAS_FLOAT(PARSE_JSON('3.14'))
AS_DECIMAL将 VARIANT 值转换为 DECIMALAS_DECIMAL(PARSE_JSON('12.34'))
AS_STRING将 VARIANT 值转换为 STRINGAS_STRING(PARSE_JSON('"hello"'))
AS_BINARY将 VARIANT 值转换为 BINARYAS_BINARY(TO_BINARY('abcd')::VARIANT)
AS_DATE将 VARIANT 值转换为 DATEAS_DATE(TO_DATE('2025-10-11')::VARIANT)
AS_ARRAY将 VARIANT 值转换为 ARRAYAS_ARRAY(PARSE_JSON('[1,2,3]'))
AS_OBJECT将 VARIANT 值转换为 OBJECTAS_OBJECT(PARSE_JSON('{"a":1}'))

类型谓词函数

函数描述示例
IS_ARRAY检查 JSON 值是否为 ARRAYIS_ARRAY(PARSE_JSON('[1,2,3]'))
IS_OBJECT检查 JSON 值是否为 OBJECTIS_OBJECT(PARSE_JSON('{"a":1}'))
IS_STRING检查 JSON 值是否为 STRINGIS_STRING(PARSE_JSON('"hello"'))
IS_INTEGER检查 JSON 值是否为整数IS_INTEGER(PARSE_JSON('42'))
IS_FLOAT检查 JSON 值是否为浮点数IS_FLOAT(PARSE_JSON('3.14'))
IS_BOOLEAN检查 JSON 值是否为 BOOLEANIS_BOOLEAN(PARSE_JSON('true'))
IS_NULL_VALUE检查 JSON 值是否为 nullIS_NULL_VALUE(PARSE_JSON('null'))