此问题涉及操作表列中的数据以创建其他列。原始列将订阅号存储在单个值中。我们的任务是提取这些订阅号的不同部分并将它们分布在多个列中。
一种创造性的方法涉及利用字符串操作和 XML 处理的组合。其工作原理如下:
我们将订阅号中的所有空格替换为破折号,然后使用 Replace() 函数转换破折号到一个特殊的分隔符,例如§§Split§§。这使我们能够将转换后的数字视为 XML 结构。
replace(replace(subscription_number, ' ', '-'), '-', '§§Split§§')
转换后的数字变为:
<x>SC-5-1395-174-25P</x>
使用 Cast() 函数,我们将转换后的数字包装在 XML 标签中,然后使用 xDim.value() 函数提取各个部分。例如,要获取第一部分 (SC),我们使用:
ltrim(rtrim(xDim.value('/x[1]', 'varchar(max)')))
我们使用交叉应用将提取的值分配给结果集中的新列。这是一个示例:
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中文网其他相关文章!