嗨,我有一个输入

ID  data 
1   hello 
2   sql 

所需的输出是
ID  RowID  Chars 
1    1     H 
1    2     e 
1    3     l 
1    4     l 
1    5     o 
2    1     s 
2    2     q 
2    3     l 

我的方法到目前为止
Declare @t table(ID  INT IDENTITY , data varchar(max)) 
Insert into @t Select 'hello' union all select 'sql' 
--Select * from @t 
;With CteMaxlen As( 
Select MaxLength = max(len(data)) from @t) 
, Num_Cte AS 
(      
      SELECT 1 AS rn 
      UNION ALL 
      SELECT rn +1 AS rn  
      FROM Num_Cte  
      WHERE rn <(select MaxLength from CteMaxlen) 
) 
-- Shred into individual characters 
, Get_Individual_Chars_Cte AS 
(  
      SELECT   
            ID 
            ,Row_ID =ROW_NUMBER() Over(PARTITION by ID Order by ID) 
            ,chars                
      FROM @t,Num_Cte 
      CROSS APPLY( SELECT SUBSTRING((select data from  @t),rn,1)  AS chars) SplittedChars        
) 
 
Select * from Get_Individual_Chars_Cte  

该查询根本不起作用,但有一个异常(exception)

Msg 512, Level 16, State 1, Line 4
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.



编辑 :

我找到了我的答案
;with Get_Individual_Chars_Cte AS 
(  
   SELECT  
        ID, 
        Row_ID =ROW_NUMBER() Over(PARTITION by ID Order by ID)  
        ,SUBSTRING(Data,Number,1) AS [Char]--, 
 
FROM @t   
INNER JOIN master.dbo.spt_values ON 
 Number BETWEEN 1 AND LEN(Data) 
 AND type='P' 
 
) 
 
Select * from Get_Individual_Chars_Cte  

需要帮助

请您参考如下方法:

;with cte as 
( 
  select ID, 
         substring(data, 1, 1) as Chars, 
         stuff(data, 1, 1, '') as data, 
         1 as RowID 
  from @t 
  union all 
  select ID, 
         substring(data, 1, 1) as Chars, 
         stuff(data, 1, 1, '') as data, 
         RowID + 1 as RowID 
  from cte 
  where len(data) > 0 
) 
select ID, RowID, Chars 
from cte 
order by ID, RowID 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!