嗨我输入
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
该查询根本不起作用,但
是例外Msg 512,Level 16,State 1,Line 4
子查询返回的值超过1。 这是不允许的 子查询跟随=,!=,&lt;,&lt; =,&gt;,&gt; = 或者子查询用作 表达
编辑:
我找到了答案
;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
需要帮助
答案 0 :(得分:3)
;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
答案 1 :(得分:0)
旧帖子但是值得发布纯粹的基于集合的解决方案。使用NGrams8K即可:
Declare @t table(ID INT IDENTITY , data varchar(max))
Insert into @t Select 'hello' union all select 'sql';
SELECT ID, Row_ID = position, [char] = token
FROM @t
CROSS APPLY dbo.NGrams8k(data,1);
<强>返回:强>
ID Row_ID char
--- ------- --------
1 1 h
1 2 e
1 3 l
1 4 l
1 5 o
2 1 s
2 2 q
2 3 l