注册 登录

清河洛

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


网址导航