clickhouse使用extract提取分号之前,之后,中间的内容

Area:'安徽;宣城;宣州',要提取分号之前,两个分号之前,最后一个分号之后的内容作为省市区

这是最后得到的正确的结果,感谢chatgpt

刚开始本来想使用splitByString

复制代码
-- 宣城
select splitByString(';','安徽;宣城;宣州')[2];

可以直接指定分隔符拆分成字符串数组,但是我的这个表的这个字段设计是Nullable类型的,没法使用这个函数使用这个函数会报错,就算使用where过滤也是不行的

select splitByString(';',Area)[2] from (select Area from table where Area is not null and Area != '');

复制代码
还有positionUTF8,substringUTF8也尝试过了,也不能对Nullable类型的字段使用
select  Area,positionUTF8(Area,';',1),substringUTF8(Area,1,length(Area)-positionUTF8(Area,';',1))
from table where BillNo = '76AJNX1ZE334FD2';
最后只能用extract函数了,通过正则表达式进行提取。

-- 1,获取省
SELECT
    extract('安徽;宣城;宣州', '([^;]+)') AS extracted_text,extractAll('安徽;宣城;宣州', '([^;]+)')[3] AS extracted_text2;

SELECT
    Area,extract(Area, '([^;]+)') from  table where BillNo = '76AJNX1ZE314FD1';
-- 最简单的方式是使用extractAll('安徽;宣城;宣州', '([^;]+)')根据分号拆分成数组,但是由于clickhouse限制无法对Nullable类型的字符串使用这个函数,
-- 等同于splitByString函数,select splitByString(';','安徽;宣城;宣州')[2];
-- SELECT
--     extractAll(Area, '([^;]+)')[3] AS extracted_text2 from table where BillNo = '76AJNX1ZE334FD2';
-- 2,获取市
SELECT
    extract('安徽;宣城;宣州', ';([^;]+);') AS extracted_text;

-- 3,获取区
SELECT extract('安徽;宣城;宣州', ';([^;]+)$') AS extracted_text;
相关推荐
斯特凡今天也很帅1 天前
clickhouse常用语句汇总——持续更新中
数据库·sql·clickhouse
SelectDB技术团队2 天前
从 ClickHouse、Druid、Kylin 到 Doris:网易云音乐 PB 级实时分析平台降本增效
大数据·数据仓库·clickhouse·kylin·实时分析
risc1234567 天前
【ClickHouse】RollingBitmap
clickhouse
斯特凡今天也很帅7 天前
clickhouse如何查看操作记录,从日志来查看写入是否成功
数据库·clickhouse
袖清暮雨12 天前
ClickHouse讲解
大数据·数据库·数据仓库·clickhouse·oracle
江枫渔火L13 天前
使用clickhouse的ReplacingMergeTree引擎表做活跃玩家信息表
数据库·clickhouse
潇凝子潇15 天前
Doris ClickHouse Greenplum 对比
clickhouse·doris·greenplum
递归尽头是星辰17 天前
ClickHouse核心优势分析与场景实战
大数据·数据仓库·clickhouse·实时分析·实时查询
鲁尼的小宝贝18 天前
基于Flink的数据中台管理平台
java·大数据·clickhouse·flink·yarn
问道飞鱼22 天前
【大数据知识】今天聊聊Clickhouse部署方案
大数据·clickhouse·部署