如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)

这篇博客探讨了如何处理非结构化的SQL数据,尤其是那些包含键值对格式的数据字段。作者指出,由于SQL主要用于处理结构化数据,因此对于此类问题,使用编程语言如Java或Python更为合适。文章中提供了创建临时表、插入数据和拆分字段的步骤示例,但强调这些操作在SQL中并不直观,更适合采用程序语言进行处理。
摘要由CSDN通过智能技术生成

通过SQL按内容分拆成多字段

需求描述

将表里的一个字段,该字段的某行开始是key,随后对应的是其value,将key和value分别拆分对应的两个字段。如下图示例:

 问题分析

该问题不适合用SQL来处理,因为SQL主要处理表格形式的结构化数据,用程序语言如Java、Python等更方便些。

解决方法

-- # SQL不擅长处理这种数据,用程序语言更方便些。
-- Step1 创建表并初始化数据
CREATE TABLE tb_data(
data varchar(20)
)
INSERT INTO tb_data
SELECT 'a.wav' data UNION 
SELECT 1 data UNION 
SELECT 2 data UNION 
SELECT 'b.wav' data UNION 
SELECT 3 data UNION 
SELECT 4 data UNION 
SELECT 'c.wav' data UNION 
SELECT 5 data UNION
SELECT 6 data  UNION
SELECT 7 data 

-- SELECT * FROM tb_data
-- Step2 创建临时表tmp_data,主要存记录序号、分割开始位置、记录数。
-- DROP TABLE tmp_data;
create TEMPORARY table tmp_data(
id int,
data varchar(20),
pos smallint,
cnt int
)

-- Step3 插入临时表。
INSERT INTO tmp_data
SELECT (@i:=@i+1)id,tb_data.*,INSTR(data,'.') dot,cnt
FROM tb_data,(select @i:=0)t ,(SELECT COUNT(1) cnt FROM tb_data) t2 

SELECT * FROM tmp_data

-- Step4 拆分字段 
SELECT B.data,A.data seq
-- * 
FROM tmp_data A
JOIN 
(
		SELECT * ,
		CASE WHEN LEAD(id)OVER(order by id) IS NULL THEN 999999 ELSE LEAD(id)OVER(order by id) END as next
		FROM tmp_data
		WHERE pos>0
) B
ON A.id > B.id AND A.id < B.next

-- Step 4 查看结果
/*
data	seq
a.wav	1
a.wav	2
b.wav	3
b.wav	4
c.wav	5
c.wav	6
c.wav	7
*/

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShenLiang2025

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值