【问题标题】:Use split function to show each value in seperate row使用 split 函数在单独的行中显示每个值
【发布时间】:2017-12-18 09:52:34
【问题描述】:

考虑一下我已经创建了dbo.split 函数,它的操作如下:

查询:

select substr from dbo.split(',' , 'A,B,C')

结果:

|Substr|
--------
|A     |
--------
|B     |
--------
|C     |
--------

现在我想用这个函数来转换这个表:

|ID|Char|
---------
|1 |A,B |
---------
|2 |A   |
---------
|3 |B,C |
---------

到这个结果:

|ID|Char|
---------
|1 |A   |
---------
|1 |B   |
---------
|2 |A   |
---------
|3 |B   |
---------
|3 |C   |
---------

【问题讨论】:

  • 我认为您需要遍历表中的所有记录,并在每一行上使用您的拆分功能,并将拆分结果插入另一个表格,该表格将采用您想要的形式。
  • 你需要添加一些你已经写好的代码

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


【解决方案1】:

试试这个:

这在没有Split 函数的情况下有效。

 DECLARE @Table TABLE(ID INT, [Char] VARCHAR(20))
 INSERT INTO @Table VALUES(1,'A,B')
 INSERT INTO @Table VALUES(2,'A')
 INSERT INTO @Table VALUES(3,'B,C')

SELECT A.ID,  
     Split.a.value('.', 'VARCHAR(100)') AS [Char]  
 FROM  
 (
     SELECT ID,  
         CAST ('<M>' + REPLACE([Char], ',', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  @Table
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);

【讨论】:

    【解决方案2】:

    由于您已经有了dbo.split 函数,您可以使用CROSS APPLY 来获得所需的输出:

    DECLARE @tmp TABLE(ID INT, [Char] VARCHAR(50))
    INSERT INTO @tmp VALUES(1,'A,B'), (2,'A'), (3,'B,C')
    
    select T.[ID], D.[Substr] 
    from @tmp T cross apply [dbo].[Split](',', T.[Char]) D
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 2013-12-08
      相关资源
      最近更新 更多