【问题标题】:SQL Server 2014 : Convert two comma separated string into two columnsSQL Server 2014:将两个逗号分隔的字符串转换为两列
【发布时间】:2021-07-03 12:28:05
【问题描述】:

我有两个逗号分隔的字符串,需要转换成一个临时表,其中两列根据索引同步。

如果输入字符串如下

a = 'abc,def,ghi'
b = 'aaa,bbb,ccc'

那么输出应该是

column1 | column2
------------------
abc     | aaa
def     | bbb
ghi     | ccc

假设我有函数fnConvertCommaSeparatedStringToColumn,它接受逗号分隔的字符串和分隔符作为参数,并返回一个带有值的列。我在两个字符串上都使用它并得到两列来验证两边的计数是否相同。但是最好两个将它们放在一个临时表中。我该怎么做?

【问题讨论】:

    标签: sql sql-server string split sql-server-2014


    【解决方案1】:

    假设我有一个函数......返回一个包含值的列。

    此时,基本思想是选择列并将row_number() 函数与两个字符串一起使用。然后您可以将JOIN 两者一起使用row_number() 结果作为连接的匹配字段。

    【讨论】:

      【解决方案2】:

      一种方法是递归 CTE:

      with cte as (
            select convert(varchar(max), null) as a_part, convert(varchar(max), null) as b_part,
                   convert(varchar(max), 'abc,def,ghi') + ',' as a,
                   convert(varchar(max), 'aaa,bbb,ccc') + ',' as b,
                   0 as lev
            union all
            select convert(varchar(max), left(a, charindex(',', a) - 1)),
                   convert(varchar(max), left(b, charindex(',', b) - 1)),
                   stuff(a, 1, charindex(',', a), ''),
                   stuff(b, 1, charindex(',', b), ''),
                   lev + 1
            from cte
            where a <> '' and lev < 10
           )
      select a_part, b_part
      from cte
      where lev > 0;
      

      Here 是一个 dbfiddle。

      【讨论】:

        【解决方案3】:

        这里有一些你可以尝试的有点偷偷摸摸的东西。

        我没有您的定制函数,所以使用了内置的string_split 函数 (SQL2016+) - 用于快速测试,但假设参数相同。理想情况下,您的定制函数应该返回它自己的行号,在这种情况下您可以使用它而不是行号函数。

        declare @a varchar(20)='abc,def,ghi', @b varchar(20)='aaa,bbb,ccc';
            with v as (
                select a.value A,b.value B, 
                  row_number() over(partition by a.value order by (select 1/0))Arn,
                  row_number() over(partition by b.value order by (select 1/0))Brn
                from fnConvertCommaSeparatedStringToColumn (@a,',')a
                cross apply fnConvertCommaSeparatedStringToColumn (@b,',')b
            )
            select A,B from v
            where Arn=Brn
        

        【讨论】:

          【解决方案4】:

          我建议获取一个(基于集合的)函数,该函数可以基于分隔符拆分字符串,该函数也返回序数位置。例如DelimitedSplit8k_LEAD。然后您可以简单地拆分值,并将JOIN 放在序号位置:

          DECLARE @a varchar(100) = 'abc,def,ghi';
          DECLARE @b varchar(100) = 'aaa,bbb,ccc';
          
          SELECT A.Item AS A,
                 B.Item AS B
          FROM dbo.delimitedsplit8k_lead(@a,',') A
               FULL OUTER JOIN dbo.delimitedsplit8k_lead(@a,',') B ON A.ItemNumber = B.ItemNumber;
          

          db<>fiddle

          我使用FULL OUTER JOIN,然后如果任一列具有NULL 值,您就知道这两个分隔列表没有相同数量的分隔值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-08-19
            • 1970-01-01
            • 1970-01-01
            • 2017-11-27
            • 1970-01-01
            • 1970-01-01
            • 2012-09-04
            相关资源
            最近更新 更多