ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-12-06 10:02:20  阅读:368  来源: 互联网

标签:段值 -- UNION 拆分 SQL wav data id SELECT


通过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
*/

 

 

标签:段值,--,UNION,拆分,SQL,wav,data,id,SELECT
来源: https://blog.csdn.net/shenliang1985/article/details/121691098

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有