duckdb复合数据类型的相关函数
qingheluo2024-11-21清河洛228
Array和LISTArray和LIST都是表示一组有序的相同数据类型的数据序列,其中Array为固定长度,LIST为可变长度定义:
Array:Type[size]
LIST :Type[]
创建:
字面量形式两者相同:[val1,val2,...]
函数形式:
Array:array_value(val1,val2,...)
LIST :list_value(val1,val2,...)由于两者的底层实现相同,所以相关的操作函数均为别名的形式,均可通用信息
len(list) 长度
别名 ...
Array和LIST
Array和LIST都是表示一组有序的相同数据类型的数据序列,其中Array为固定长度,LIST为可变长度
定义:
Array:Type[size]
LIST :Type[]
创建:
字面量形式两者相同:[val1,val2,...]
函数形式:
Array:array_value(val1,val2,...)
LIST :list_value(val1,val2,...)
由于两者的底层实现相同,所以相关的操作函数均为别名的形式,均可通用
信息
len(list) 长度
别名 array_length
list_unique(list) 唯一元素的数量
别名 array_unique
增
list_resize(list, size[, value]) 拓展长度,新增元素使用val(默认NULL)填充
别名 array_resize
list_append(list, val) 将元素val值追加到末尾
别名 array_append, array_push_back
list_prepend(val, list) 将元素val值添加到开头
别名 array_prepend, array_push_front
list_concat(list1, list2) 连接两个LIST
字面量 list1 || list2
别名 list_cat, array_concat, array_cat
删
array_pop_back(list) 返回不带末尾元素的LIST
array_pop_front(list) 返回不带开头元素的LIST
改
list_slice(list,begin:end[,step]) 返回截取的LIST(两端均包含)
字面量 list[begin:end[:step]]
别名 array_slice,list
查
list_extract(list, index) 获取指定索引的值
索引值从1开始,支持负值
字面量 list[index]
别名 list_element, array_extract
list_contains(list, val) 是否包含val
别名 list_has, array_contains, array_has
list_any_value(list) 返回第一个非null值
list_position(list, val) 返回val的索引,未找到返回NULL
别名 list_indexof, array_position, array_indexof
list_select(value_list, index_list) 根据index_list返回列表
别名array_select
筛选
list_filter(list, lambda) 从lambda函数返回true的元素组成的列表
别名 array_filter, filter
如 x -> x % 2 = 0
排序
list_reverse(list) 反转
别名 array_reverse
list_sort(list) 列表排序,默认为升序,NULL值默认为最小值,所以NULL默认排在最上面
第二个参数表示排序方式,可选值'ASC'(默认) / 'DESC'
第三个参数表示NULL值的位置,可选值'NULLS FIRST' / 'NULLS LAST'
别名 array_sort
list_grade_up(list) 排序后的原list的元素索引值
别名 array_grade_up
list_reverse_sort(list) 排序后进行反转
别名 array_reverse_sort
操作
flatten(list) 展平一个多维列表
list_distinct(list) 删除所有重复项和NULL值,不保留原始顺序
别名 array_distinct
list_aggregate(list, name) 对list的元素执行聚合函数name
别名 list_aggr, aggregate, array_aggregate, array_aggr
list_transform(list, lambda) 将lambda函数应用于每个元素的结果组成的列表
别名 array_transform, apply, list_apply, array_apply
如 x -> x % 2
list_reduce(list, lambda) 返回一个值,将lambda函数应用于每个元素的计算结果
别名 array_reduce, reduce
如 (x, y) -> x + y 全部元素相加
多个list操作
list_has_all(list, sub-list) sub-list中的所有元素是否都存在于list中
别名 array_has_all
list_has_any(list1, list2) 两个list是否存在任一相同值
别名 array_has_any
list_intersect(list1, list2) 交集
别名 array_intersect
list_zip(list_1, list_2, ...[, truncate]) 将多个数组组成多维数组
默认长度将是最长列表的长度,缺少的元素将替换为 NULL
别名函数 array_zip
MAP
MAP数据类型是一种键值对的集合,键和值可以是不同数据类型且每行中的键可以不相同
定义:MAP(key_type, val_type))
构建:
字面量 MAP{key1:val1,key2:val2,...}
函数 MAP([key1, key2,...], [val1, val2,...]))
map_from_entries([(key1, val1), (key2, val2),...])
常用函数
信息
cardinality(map) 键值对数量
map_keys(map) 所有key组成的LIST
map_values(map) 所有value组成的LIST
查
element_at(map, key) 返回key对应值组成的LIST
字面量 map[key]
别名 map_extract
map_contains(map, key) map是否包含key键
map_contains_entry(map, key, value) map是否包含指定的键值对
map_contains_value(map, value) map是否包含值
操作
map_entries(map) 回map中键值对的struct列表
如 SELECT map_entries(map{1:2,3:4});
返回 [{'key': 1, 'value': 2}, {'key': 3, 'value': 4}]
STRUCT
STRUCT数据类型允许将多个key组合成一个嵌套的结构体
STRUCT类型中key只能是字符串,而每个key对应的值可以是不同的数据类型
在实际使用中,已定义了key的结构体称之为命名结构体
未定义key的结构体称之为未命名结构体
定义:STRUCT(key1 Type, key2 Type, ...))
// 如 STRUCT(name TEXT, age INTEGER)
构建:
命名结构体 STRUCT(key1_val, key2_val, ...)
// 如 STRUCT('myname', 30)
// 根据已经定义结构体来填充各字段
struct_pack(key1 := key1_val, ...)
// 直接创建一个结构体数据
未命名结构体 row(val1,val2,...)
查询:SELECT id,attr.name AS name,attr.age AS age FROM demo_table
条件:SELECT * FROM demo_table WHERE attr.age > 28
常用函数
增
struct_insert(struct, key := val, ...) 在现有结构体中增加新的字段
查
struct_extract(struct, key) 获取指定key的值
字面量 struct.key / struct[key]
未命名结构体的key使用从1开始的数字索引
UNION
UNION数据类型可以存储多种不同类型数据,通过额外的标志tag来标识当前存储的数据类型
定义:UNION(tag1 Type, tag2 Type))
// 如 UNION(num INTEGER, text VARCHAR)
构建:union_value(tag := val)
// 也可以直接使用值,DuckDB会在后台自动进行数据类型识别和必要的隐式转换
常用函数
union_extract(union, 'tag') 提取指定tag的值,不是该tag返回NULL
字面量 union.tag
union_tag(union) 获取tag