Разбить строку на отдельные символы в Sql Server 2005 - PullRequest
7 голосов
/ 16 июня 2011

Привет, у меня есть входные данные

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, уровень 16, состояние 1, строка 4
Подзапрос возвратил более 1 значения.Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Редактировать:

Iнашел мой ответ

;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 

Требуется помощь

Ответы [ 2 ]

3 голосов
/ 16 июня 2011
;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
0 голосов
/ 16 мая 2017

Старая запись, но стоит опубликовать решение, основанное исключительно на множествах.Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...