首页 >数据库 >mysql教程 >如何在 SQL 中将单列订阅号拆分为多列?

如何在 SQL 中将单列订阅号拆分为多列?

Barbara Streisand
Barbara Streisand原创
2024-12-25 20:39:14644浏览

How Can I Split a Single Column of Subscription Numbers into Multiple Columns in SQL?

将单个列分解为多个列

此问题涉及操作表列中的数据以创建其他列。原始列将订阅号存储在单个值中。我们的任务是提取这些订阅号的不同部分并将它们分布在多个列中。

一种创造性的方法涉及利用字符串操作和 XML 处理的组合。其工作原理如下:

第 1 步:将订阅号转换为 XML 结构

我们将订阅号中的所有空格替换为破折号,然后使用 Replace() 函数转换破折号到一个特殊的分隔符,例如§§Split§§。这使我们能够将转换后的数字视为 XML 结构。

replace(replace(subscription_number, ' ', '-'), '-', '§§Split§§')

转换后的数字变为:

<x>SC-5-1395-174-25P</x>

步骤 2:从 XML 结构中提取值

使用 Cast() 函数,我们将转换后的数字包装在 XML 标签中,然后使用 xDim.value() 函数提取各个部分。例如,要获取第一部分 (SC),我们使用:

ltrim(rtrim(xDim.value('/x[1]', 'varchar(max)')))

步骤 3:将提取的值分配给新列

我们使用交叉应用将提取的值分配给结果集中的新列。这是一个示例:

Select A.subscription_number,
       B.Pos1 as Col1,
       B.Pos2 as Col2,
       B.Pos3 as Col3,
       B.Pos4 as Col4,
       B.Pos5 as Col5,
       B.Pos6 as Col6,
       B.Pos7 as Col7
From table A
Cross Apply (
    Select Pos1 = ltrim(rtrim(xDim.value('/x[1]', 'varchar(max)')))
          , Pos2 = ltrim(rtrim(xDim.value('/x[2]', 'varchar(max)')))
          , Pos3 = ltrim(rtrim(xDim.value('/x[3]', 'varchar(max)')))
          , Pos4 = ltrim(rtrim(xDim.value('/x[4]', 'varchar(max)')))
          , Pos5 = ltrim(rtrim(xDim.value('/x[5]', 'varchar(max)')))
          , Pos6 = ltrim(rtrim(xDim.value('/x[6]', 'varchar(max)')))
          , Pos7 = ltrim(rtrim(xDim.value('/x[7]', 'varchar(max)')))
    From (
        Select Cast('<x>' + replace((Select replace(replace(A.subscription_number, ' ', '-'), '-', '§§Split§§') as [*] For XML Path('')), '§§Split§§', '</x><x>') + '</x>' as xml) as xDim
    ) as A
) B

这种方法允许我们优雅地将单个列值拆分为多个新列,从而提供一种干净且结构化的方式来存储和访问数据。

以上是如何在 SQL 中将单列订阅号拆分为多列?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn