如何在SQL Server中的2个不同的列中拆分单独的字符串

时间:2018-11-11 17:40:13

标签: sql sql-server

我有2列管道分隔的数据,我需要将它们分成几行,但各列必须保持在一起。这是我的数据:

Plan Name:  ABC|DEF|GHI|JKL
Plan Type:  HMO|POS|HMO|PPO

我需要以如下四行结尾:

1 - ABC HMO
2 - DEF POS
3 - GHI HMO
4 - JKL PPO

我知道如何使用STUFF函数分别分隔每一列,但是如何保留第1列的第一个值和第2列的第一个值,等等?不知道从哪里开始。感谢任何帮助!

p.s。 -我不在SQL Server 2016上,所以不能使用STRING_SPLIT

2 个答案:

答案 0 :(得分:1)

一种方法是递归CTE:

with t as (
      select *
      from (values ('ABC|DEF|GHI|JKL', 'HMO|POS|HMO|PPO')) v(plannames, plantypes)
      ),
      cte as (
       select convert(varchar(max), left(plannames, charindex('|', plannames + '|') - 1)) as planname,
              convert(varchar(max), left(plantypes, charindex('|', plantypes + '|') - 1)) as plantype,
              convert(varchar(max), stuff(plannames, 1, charindex('|', plannames + '|'), '')) as planname_rest,
              convert(varchar(max), stuff(plantypes, 1, charindex('|', plantypes + '|'), '')) as plantype_rest,
              1 as lev
       from t
       union all
       select convert(varchar(max), left(planname_rest, charindex('|', planname_rest + '|') - 1)) as planname,
              convert(varchar(max), left(plantype_rest, charindex('|', plantype_rest + '|') - 1)) as plantype,
              convert(varchar(max), stuff(planname_rest, 1, charindex('|', planname_rest + '|'), '')) as planname_rest,
              convert(varchar(max), stuff(plantype_rest, 1, charindex('|', plantype_rest + '|'), '')) as plantype_rest,
              lev + 1
       from cte
       where planname_rest <> ''
       )
select *
from cte;

Here是db <>小提琴。

答案 1 :(得分:0)

您可以使用delimitedsplit8k_lead

SELECT CONVERT(varchar(3), itemnumber) + ' - ' + PN.item + ' ' + PT.item
FROM YourTable YT
     CROSS APPLY dbo.delimitedsplit8k_lead(YT.PlanName,'|') PN
     CROSS APPLY dbo.delimitedsplit8k_lead(YT.PlanType,'|') PT
WHERE PN.ItemNumber = PT.ItemNumber;

假定 PlanName和PlanType具有相同数量的元素。