В MS SQL как разбить столбец на строки без разделителя - PullRequest
4 голосов
/ 08 июля 2011

У меня есть данные в таблице, которая выглядит так (стоит отметить, что они не разделены CSV)

Его нужно разделить на отдельные символы

Data
abcde

хочу преобразовать это в

Data
a
b
d
c
e

Я посмотрел в интернете, но не нашел ответа

Ответы [ 5 ]

6 голосов
/ 08 июля 2011
CREATE FUNCTION dbo.SplitLetters
(
    @s NVARCHAR(MAX)
)
RETURNS @t TABLE
(
    [order] INT,
    [letter] NCHAR(1)
)
AS
BEGIN
    DECLARE @i INT;
    SET @i = 1;
    WHILE @i <= LEN(@s)
    BEGIN
        INSERT @t SELECT @i, SUBSTRING(@s, @i, 1);
        SET @i = @i + 1;
    END
    RETURN;
END
GO

SELECT [letter]
    FROM dbo.SplitLetters(N'abcdefgh12345 6 7')
    ORDER BY [order];
3 голосов
/ 08 июля 2011

Вы можете присоединить таблицу к списку чисел и использовать substring, чтобы разбить столбец данных на строки:

declare @YourTable table (data varchar(50))
insert @YourTable 
          select 'abcde' 
union all select 'fghe'

; with  nrs as
        (
        select  max(len(data)) as i
        from    @YourTable
        union all
        select  i - 1
        from    nrs
        where   i > 1
        )
select  substring(yt.data, i, 1)
from    nrs
join    @YourTable yt
on      nrs.i < len(yt.data)
option  (maxrecursion 0)
3 голосов
/ 08 июля 2011
declare @T table
(
  ID int identity,
  Data varchar(10)
)

insert into @T
select 'ABCDE' union 
select '12345'

;with cte as 
(
  select ID,
         left(Data, 1) as Data,
         stuff(Data, 1, 1, '') as Rest
  from @T
  where len(Data) > 0
  union all
  select ID,
         left(Rest, 1) as Data,
         stuff(Rest, 1, 1, '') as Rest
  from cte
  where len(Rest) > 0
)
select ID,
       Data
from cte
order by ID
3 голосов
/ 08 июля 2011

Предыдущее сообщение, которое решает проблему: TSQL UDF для разделения строки каждые 8 ​​символов

Передайте значение от 1 до @ length.

2 голосов
/ 08 июля 2011
declare @input varchar(max);
set @input = 'abcde'

declare @table TABLE (char varchar(1));


while (LEN(@input)> 0)
begin
insert into @table select substring(@input,1,1)
select @input = RIGHT(@input,Len(@input)-1) 
end

select * from @table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...