如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)相关的知识,希望对你有一定的参考价值。
通过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
*/
以上是关于如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)的主要内容,如果未能解决你的问题,请参考以下文章