Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Преобразовывание строки в столбец  [new]
DimDim197
Member

Откуда:
Сообщений: 6
Люди добрые, всем доброго дня!

Изучаю sql и столкнулся со следующей задачей:
Надо преобразовать сроку в столбец:
--select '1,2,3,4,5'
--1
--2
--3
--4
--5

Помогите пожалуйста, желательно попроще и доступнее для понимания!
Заранее спасибо
8 июл 14, 13:24    [16274882]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Glory
Member

Откуда:
Сообщений: 104751
DimDim197
желательно попроще и доступнее для понимания!

Одной командой этого не сделать.
Можете взять/найти какое то число из множества вариантов реализации парсинга строки и разобраться в них
8 июл 14, 13:27    [16274895]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
DimDim197,

Зачем?
8 июл 14, 13:27    [16274898]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
DimDim197
Member

Откуда:
Сообщений: 6
gandjustas,

задание такое)
8 июл 14, 13:31    [16274930]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
DimDim197,

While (есть запятые) 
begin
insert в таблицу ближайшего значения до запятой
set новая запятая
end


либо convert to xml + openxml
8 июл 14, 13:32    [16274936]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
DimDim197
Member

Откуда:
Сообщений: 6
Glory,

А если не одной?
Сейчас погуглю про парсинг
8 июл 14, 13:32    [16274937]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Glory
Member

Откуда:
Сообщений: 104751
DimDim197
А если не одной?

А если не одной, то придется сначала изучить SQL вообще и TSQL в частности
8 июл 14, 13:33    [16274947]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Glory
DimDim197
А если не одной?

А если не одной, то придется сначала изучить SQL вообще и TSQL в частности



1) Самое тупое решение через PATINDEX,
2) Более грамотное решение CLR библиотека c регулярными выражениями
8 июл 14, 13:41    [16275020]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Можно так.
DECLARE	@CommaList nvarchar(max) = '1,2,3,4,5';

WITH str_nums ( n1, n2) 
AS 
( 
SELECT 0 as n1, CHARINDEX(',', @CommaList + ',') as n2
UNION ALL 
SELECT CAST(n2 AS int) as n1, CHARINDEX(',', @CommaList + ',', n2 + 1) as n2
from str_nums
WHERE n2<LEN(@CommaList)
) 
SELECT CONVERT(int, SUBSTRING(@CommaList, n1+1, n2-n1-1)) as Value FROM str_nums
WHERE LTRIM(RTRIM(SUBSTRING(@CommaList, n1+1, n2-n1-1))) <> ''
8 июл 14, 13:52    [16275118]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Такое писать на транзакте все равно что делать хлеборезку их DVD проигрывателя.
8 июл 14, 14:40    [16275532]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Владислав Колосов
Такое писать на транзакте все равно что делать хлеборезку их DVD проигрывателя.


Я вам удивляюсь, зачем сидеть на форуме по сиквелу и говорить что он ничего не может и на нем ничего нельзя делать?

declare @str varchar(max) = '1,2,3,4,5'
declare @xml xml = '<row a="' + replace(@str, ',', '"/><row a="') + '"/>'
SELECT 
         r.value('@a', 'int') as col  
FROM 
    @xml.nodes('/row') col(r) 
8 июл 14, 16:03    [16276238]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Penner
Member

Откуда:
Сообщений: 342
CREATE FUNCTION [dbo].[str2row] (
	@RowData NVARCHAR(MAX)
	,@SplitOn NVARCHAR(5)
	)
RETURNS @ReturnValue TABLE (Data NVARCHAR(MAX))
AS
BEGIN
	DECLARE @Counter INT = 1

	WHILE (Charindex(@SplitOn, @RowData) > 0)
	BEGIN
		INSERT INTO @ReturnValue (data)
		SELECT Data = ltrim(rtrim(Substring(@RowData, 1, Charindex(@SplitOn, @RowData) - 1)))

		SET @RowData = Substring(@RowData, Charindex(@SplitOn, @RowData) + 1, len(@RowData))
		SET @Counter += 1
	END

	INSERT INTO @ReturnValue (data)
	SELECT Data = ltrim(rtrim(@RowData))

	RETURN
END
8 июл 14, 16:07    [16276278]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вот зачем создавать еще одну тему со своими вариантами парсинга строки ?
8 июл 14, 16:10    [16276301]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
автор
Я вам удивляюсь, зачем сидеть на форуме по сиквелу и говорить что он ничего не может и на нем ничего нельзя делать?

А еще он умеет крестиком вышивать и варенье варить... Только крестиком медленно, а варенье все время подгорает. Пусть уж лучше парсит то, что должно парсить. Нечего голову забивать ересью, надо сразу делать правильно. Как уже выяснили компетентные товарищи, наиболее удачным вариантом является разбор строки (произвольного размера) CLR функцией.
8 июл 14, 16:18    [16276349]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владислав Колосов
Как уже выяснили компетентные товарищи, наиболее удачным вариантом является разбор строки (произвольного размера) CLR функцией.

А чем/кем была протестирована компетентность этих товарищей ?
8 июл 14, 16:21    [16276364]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
DimDim197
Member

Откуда:
Сообщений: 6
Спасибо большое Glory и WarAnt - вчера в интернете нашел пару статей по парсингу строки и разобрался!
9 июл 14, 12:07    [16280242]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Glory
Владислав Колосов
Как уже выяснили компетентные товарищи, наиболее удачным вариантом является разбор строки (произвольного размера) CLR функцией.

А чем/кем была протестирована компетентность этих товарищей ?


Не так давно на форуме был разбор полетов с тестированием... Ссылку не сохранил.
9 июл 14, 13:04    [16280585]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовывание строки в столбец  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
А, нет, пардон:
http://sqlperformance.com/2012/07/t-sql-queries/split-strings
9 июл 14, 13:41    [16280888]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить