【问题标题】:Convert string column into characters rows将字符串列转换为字符行
【发布时间】:2021-05-06 06:38:53
【问题描述】:

我有一个包含以下数据的表:

id value
1 P126

我需要把这张表转换成

id value
1 P
2 1
3 2
4 6

我试过STRING_SPLIT,但它不适用于空分隔符。

有人可以帮我格式化数据吗?

【问题讨论】:

  • s per question guide,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server azure-sql-database


【解决方案1】:

您可以通过使用递归 cte 来解决这个问题:

DECLARE @t nvarchar(10) = 'P126';

WITH cte AS (
SELECT 1 id, LEFT(@t, 1) col, RIGHT(@t, LEN(@t)-1) txt
UNION ALL
SELECT id+1, LEFT(txt, 1), RIGHT(txt, LEN(txt)-1)
  FROM cte
  WHERE LEN(txt) >= 1
)
SELECT id, col
  FROM cte

【讨论】:

    【解决方案2】:

    你可以这样做:

    declare @str as varchar(2048) = 'P126'
    
    ;with c0 as(
    select @str as s
    ), c1 as(
    select number as n from master.dbo.spt_values where type = 'P' and number > 0
    )
    select SUBSTRING(c0.s, c1.n, 1) as item
           , ROW_NUMBER() over(order by c1.n) as pos
           , c0.s
    from c0
    inner join c1 on c1.n <= LEN(c0.s)
    

    【讨论】:

      【解决方案3】:

      创建表并插入值:

      CREATE TABLE [dbo].[test3](
          [id] [int] NULL,
          [value] [varchar](20) NULL
      )
      
      insert into [dbo].[test3] values (1,'P126');
      

      解决方案 1:
      我们可以通过选择查询将表中的值传递给变量@t

      DECLARE @t nvarchar(10);
      select @t=value from [dbo].[test3];
      
      WITH cte AS (
      SELECT 1 id, LEFT(@t, 1) col, RIGHT(@t, LEN(@t)-1) txt
      UNION ALL
      SELECT id+1, LEFT(txt, 1), RIGHT(txt, LEN(txt)-1)
        FROM cte
        WHERE LEN(txt) >= 1
      )
      SELECT id, col
        FROM cte
      

      解决方案 2:
      我们可以定义一个函数。
      创建一个函数来分割字符串:

      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      
      create function [dbo].[MySplitStringFunc]( @str nvarchar(100)) 
      returns @tableName Table 
        ( 
          id int identity(1,1),
          value nchar(1) 
        ) 
      as  
      
      begin 
      
        declare @insertStr nvarchar(100)
        declare @newstr nvarchar(100)
        declare @id int
        set @id=1;
        set @insertStr = substring(@str,@id,1) 
        set @newstr = stuff(@str,@id,1,'')
        begin
          insert @tableName Values(@insertStr) 
        end
        while(len(@newstr)>1)
          begin 
            set @id =@id + 1
            set @insertStr = substring(@str,@id,1) 
            insert @tableName values(@insertStr) 
            set @newstr = stuff(@newstr,1,1,'') 
          end 
          
        insert @tableName values(@newstr) 
      
        return
      end
      
      
      

      调用函数并返回一个表:

      declare @string nvarchar(100)
      select @string=value from [dbo].[test3] 
      select * from [dbo].[MySplitStringFunc](@string)
      

      【讨论】:

      • Hi@Mojo Jojo 如果我的回答对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记将其从灰色切换为已填充。)。这对其他社区成员可能是有益的。谢谢你。 :)
      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2020-02-19
      • 1970-01-01
      • 2015-01-18
      相关资源
      最近更新 更多