oracle kv字符串转换为多行两列

在Oracle数据库中,如果需要将一个包含多个值的KV(Key-Value)字符串转换为多行两列的格式,你可以使用多种方法来实现这个需求。这里将提供两种常见的方法:使用CONNECT BY语法和CASE表达式结合REGEXP_SUBSTR函数。

方法1:使用CONNECT BY

如果你KV字符串格式是类似于key1:value1,key2:value2,key3:value3这样的,你可以使用CONNECT BY和SYS_CONNECT_BY_PATH来实现:

WITH kv_data AS (

SELECT 'key1:value1,key2:value2,key3:value3' AS kv_string FROM dual

)

SELECT TRIM(SUBSTR(keys, 1, INSTR(keys, ':') - 1)) AS key,

TRIM(SUBSTR(keys, INSTR(keys, ':') + 1)) AS value

FROM (

SELECT TRIM(SYS_CONNECT_BY_PATH(SUBSTR(kv_string, INSTR(kv_string, ',', 1, level - 1) + 1,

INSTR(kv_string, ',', 1, level) - INSTR(kv_string, ',', 1, level - 1) - 1), ',') || ',') AS keys

FROM kv_data

CONNECT BY INSTR(kv_string, ',', 1, level) > 0

)

WHERE keys IS NOT NULL;

方法2:使用REGEXP_SUBSTR和CASE表达式

这种方法更适合于处理更复杂的情况或者当你想要更灵活地处理键值对时:

WITH kv_data AS (

SELECT 'key1:value1,key2:value2,key3:value3' AS kv_string FROM dual

)

SELECT REGEXP_SUBSTR(kv_string, '\^,+', 1, level) AS key_val

FROM kv_data

CONNECT BY REGEXP_SUBSTR(kv_string, '\^,+', 1, level) IS NOT NULL

AND PRIOR kv_string = kv_string

AND PRIOR sys_guid() IS NOT NULL;

然后,可以使用一个外部查询来将这个结果分解为键和值:

WITH kv_data AS (

SELECT 'key1:value1,key2:value2,key3:value3' AS kv_string FROM dual

), key_val AS (

SELECT REGEXP_SUBSTR(kv_string, '\^,+', 1, level) AS key_val

FROM kv_data

CONNECT BY REGEXP_SUBSTR(kv_string, '\^,+', 1, level) IS NOT NULL

AND PRIOR kv_string = kv_string

AND PRIOR sys_guid() IS NOT NULL

)

SELECT SUBSTR(key_val, 1, INSTR(key_val, ':') - 1) AS key,

SUBSTR(key_val, INSTR(key_val, ':') + 1) AS value

FROM key_val;

相关推荐
十二同学啊7 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
蓝速科技8 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
一 乐11 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
SelectDB11 小时前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶11 小时前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax11 小时前
MongoDB 索引与事务
java·数据库·mongodb
SelectDB11 小时前
Doris vs ClickHouse:企业 OLAP 走向下一阶段,两种技术路线如何选择
大数据·数据库·数据分析
vx-程序开发11 小时前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
一 乐12 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
这个DBA有点耶13 小时前
InnoDB页结构深入:页分裂、页合并、填充因子——B+树底层机制全解析
数据库·mysql·架构