当前位置: 首页 > ai >正文

SQL进阶:如何把字段中的键值对转为JSON格式?

JSON

  • 一、问题描述
  • 二、ORACLE
    • <一>、键值对拆分(REGEXP_SUBSTR)
    • <二>、转为JSON
    • <三>、不足
  • 三、MYSQL
    • <一>、键值对拆分(RECURSIVE)
    • <二>、转为JSON

一、问题描述

假如某张表的某列是键值对数据,如何把这个键值对转为json格式,数据如下所示

dynastyvalue
唐朝唐太宗:李世民;唐高宗:李治;唐玄宗:李隆基;…
汉朝汉高祖:刘邦;汉文帝:刘恒;汉景帝:刘启;汉武帝:‘刘彻’;…

需要转成下面这种格式

dynastyvalue
唐朝[{“key”:“唐太宗”,“value”:“李世民”,“order”:“1”},{“key”:“唐高宗”,“value”:“李治”,“order”:“2”},{“key”:“唐玄宗”,“value”:“李隆基”,“order”:“3”}…]
汉朝[{“key”:“汉高祖”,“value”:“刘邦”,“order”:“1”},{“key”:“汉文帝”,“value”:“刘恒”,“order”:“2”},{“key”:“汉景帝”,“value”:“刘启”,“order”:“3”},{“key”:“汉武帝”,“value”:“刘彻”,“order”:“2”}…]

二、ORACLE

<一>、键值对拆分(REGEXP_SUBSTR)

with split_data as (select dynasty,regexp_substr(value,'[^;]+',1,level) as part,level as part_numfrom tableconnect by regexp_substr(value,'[^;]+',1,level) is not null
)select dynasty,part_num,regexp_substr(part,'[^;]+',1,1) as key,regexp_substr(part,'[^;]+',1,2) as valuefrom split_data

执行完就是如下形式

dynastypart_numkeyvalue
唐朝1唐太宗李世民
唐朝2唐高宗李治
唐朝3唐玄宗李隆基
汉朝1汉高祖刘邦
汉朝2汉文帝刘恒
汉朝3汉景帝刘启
汉朝4汉武帝刘彻

<二>、转为JSON

转为JSON有现成的转JSON函数,完整代码如下

with split_data as (select dynasty,regexp_substr(value,'[^;]+',1,level) as part,level as part_numfrom tableconnect by regexp_substr(value,'[^;]+',1,level) is not null
),key_value_pairs as (select dynasty,part_num,regexp_substr(part,'[^;]+',1,1) as key,regexp_substr(part,'[^;]+',1,2) as valuefrom split_data
)select dynasty,json_arrayagg(josn_object('key' VALUE key,'value' VALUE value,'order' value split_num))from key_value_pairsgroup by dynasty

<三>、不足

  • 有的键值对比较大,在ORACLE是CLOB类型,不支持字符串拆分,只能用如下MYSQL方法,再进行数据同步

三、MYSQL

<一>、键值对拆分(RECURSIVE)

  • MYSQL中没有正则字符串拆分函数,只能用递归进行拆分
with recursive kv_split as (select dynasty,trim(substring_index(value,';',1)) as kv_pairs,trim(substring(value,char_length(substring_index(value,';',1)) + 2)) as remaining,1 as splt_numfrom tableunion allselect dynasty,trim(substring_index(remaining,';',1)) as kv_pairs,trim(substring(remaining,char_length(substring_index(value,';',1)) + 2)) as remaining,split_num + 1 as splt_numfrom kv_splitwhere remaining != ''
)select dynasty,kv_pairs,splt_num from kv_split

执行完为如下形式,跟ORACLE大同小异

dynastypart_numkv_pairs
唐朝1唐太宗:李世民
唐朝2唐高宗:李治
唐朝3唐玄宗:李隆基
汉朝1汉高祖:刘邦
汉朝2汉文帝:刘恒
汉朝3汉景帝:刘启
汉朝4汉武帝:刘彻

<二>、转为JSON

转成JSON跟ORACLE一样,有现成的转JSON函数,完整代码如下所示

with recursive kv_split as (select dynasty,trim(substring_index(value,';',1)) as kv_pairs,trim(substring(value,char_length(substring_index(value,';',1)) + 2)) as remaining,1 as splt_numfrom tableunion allselect dynasty,trim(substring_index(remaining,';',1)) as kv_pairs,trim(substring(remaining,char_length(substring_index(value,';',1)) + 2)) as remaining,split_num + 1 as splt_numfrom kv_splitwhere remaining != ''
)select dynasty,json_arrayagg(json_object('key',cast(substring_index(kv_pairs,':',1) as unsigned),'value',substring_index(kv_pairs,':',-1),'order',split_num)) as json_resultfrom kv_splitgroup by dynasty
http://www.xdnf.cn/news/4843.html

相关文章:

  • python调用国税乐企直连接口开数电票之额度管理
  • transformer 笔记 tokenizer moe
  • 科技创业园共享会议室线上预约及智能密码锁系统搭建指南
  • FPGA实战项目2———多协议通信控制器
  • 学习黑客认识数字取证与事件响应(DFIR)
  • 安科瑞ADL3000-E-A/KC三相交流电能表CE认证导轨表
  • Spring AI 系列——使用大模型对文本内容分类归纳并标签化输出
  • React 中 useMemo 和 useEffect 的区别(计算与监听方面)
  • 传统销售VS智能销售:AI如何重构商业变现逻辑
  • Microsoft 365 Copilot:为Teams在线会议带来多语言语音交流新体验
  • 【计算机网络-传输层】传输层协议-TCP核心机制与可靠性保障
  • Ubuntu通过源码编译方式单独安装python3.12
  • 分享一款开源的图片去重软件 ImageContrastTools,基于Electron和hash算法
  • 二叉树的深度
  • 《被讨厌的勇气》书摘
  • JVM——即时编译
  • RabbitMQ-运维
  • 【C++设计模式之Observer观察者模式】
  • 5G让媒体传播更快更智能——技术赋能内容新时代
  • 深入详解人工智能数学基础——微积分中的微分方程在神经常微分方程(Neural ODE)中的应用
  • Vue3+ts复制图片到剪贴板
  • git相关
  • TB6600HG-富利威
  • k8s之statefulset
  • 养生:塑造健康生活的良方
  • 信赖域策略优化TRPO算法详解:python从零实现
  • Unity3D实现Render Streaming推送视频流的解决方案
  • Python爬虫(22)Python爬虫进阶:Scrapy框架动态页面爬取与高效数据管道设计
  • matlab转python
  • learning ray之ray强化学习/超参调优和数据处理