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

Откуда:
Сообщений: 41
Добрый день,
в таблице имеется столбец данных varchar
строка 1 '78887 а45 f56'
строка 2 '564 78h 123456 86'
.........
строка 100000 '9845 h4545 98856 а45'

каждая строка содержит какие-то значения, разделенные пробелом, каждое разной длины. Каждая строка имеет разное количество значений.
Всего порядка 100 тысяч строк.
Значения в строках повторяются (как в примере а45)

Задача:
Значения привести в один столбец, причем без повторений, вот так:
78887
а45
f56
564
78h
123456
86
...
9845
h4545
98856

Умею сделать с одной строкой
(SELECT LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Kody'
FROM (SELECT CAST('<M>' + REPLACE((SELECT строка FROM таблица), ' '/*delimiter*/, '</M><M>') + '</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)) назв_табл

однако не доходит как сделать на много строк (((
STRING_SPLIT не работает.
Спасибо за идеи.

Сообщение было отредактировано: 2 июн 21, 15:07
2 июн 21, 15:11    [22330389]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
msLex
Member

Откуда:
Сообщений: 9022
Tavocer
STRING_SPLIT не работает.


Из-за чего?
2 июн 21, 15:16    [22330395]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Tavocer
Member

Откуда:
Сообщений: 41
msLex, 'string_split' is not a recognized built-in function name.

SSMS 18.8, SQL Server Express 2019

Сообщение было отредактировано: 2 июн 21, 15:14
2 июн 21, 15:18    [22330397]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
invm
Member

Откуда: Москва
Сообщений: 9772
Tavocer
SQL Server Express 2019
Значит уровень совместимости у БД меньше 130.
Повысьте и string_split заработает.
2 июн 21, 15:54    [22330421]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Konst_One
Member

Откуда:
Сообщений: 11614
уровень совместимости вашей базы данных смотрите в её свойствах
2 июн 21, 15:55    [22330423]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Tavocer
Member

Откуда:
Сообщений: 41
Konst_One,
это я понимаю, но база данных не моя и думаю, нельзя повысить совместимость.

Можно ли решить задачу без string_split ?

Сообщение было отредактировано: 2 июн 21, 16:06
2 июн 21, 16:14    [22330435]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
aleks222
Member

Откуда:
Сообщений: 1414
Tavocer
Konst_One,
это я понимаю, но база данных не моя и думаю, нельзя повысить совместимость.

Можно ли решить задачу без string_split ?

Можно подумать string_split - откровение господне

Этих вариантов было сделано вагон и маленькая тележка
ALTER function [dbo].[f_nStrToTableEx](@str nvarchar(4000), @delimiter nvarchar(64)=',')
returns table as
return(
WITH 
  l as (select ld = LEN(N'|' + @delimiter + N'|') - 2, [s+d] = @str + @delimiter + N'|', ls = len(@str) )
, str_nums ( n1, n2, Number ) AS 
                                ( 
                                select  1 - ld as n1, charindex( @delimiter, [s+d] ) as n2, 0 as Number from l where @str is not null
                                UNION ALL 
                                select n2 as n1, charindex (@delimiter, [s+d], n2 + ld ) as n2, Number + 1 as Number
                                from str_nums cross join l
                                WHERE n2 < ls
                                ) 
select substring( @str, n1 + ld, n2 - n1 - ld ) as Value, Number, n1 + ld as StartPosition FROM str_nums cross join l
)
2 июн 21, 16:41    [22330456]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Tavocer
Member

Откуда:
Сообщений: 41
aleks222, спасибо.

Так STRING_SPLIT работает )))

Однако, вопрос остается. Как решить задачу с помощью STRING_SPLIT ?
3 июн 21, 18:58    [22331065]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Кесарь
Member

Откуда:
Сообщений: 651
Tavocer
Konst_One,
это я понимаю, но база данных не моя и думаю, нельзя повысить совместимость.

Можно ли решить задачу без string_split ?



Tavocer
aleks222, спасибо.

Так STRING_SPLIT работает )))

Однако, вопрос остается. Как решить задачу с помощью STRING_SPLIT ?



Вы издеваетесь что ли?
3 июн 21, 19:01    [22331067]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31906
Кесарь,

ТС же написал, "база данных не моя и думаю, нельзя повысить совместимость."
3 июн 21, 20:22    [22331095]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Tavocer
Member

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

Вот для одной строки
SELECT value
FROM STRING_SPLIT((SELECT TOP 1 tablica.stolbec FROM tablica), ' ')

Как сделать для всех строк столбца stolbec ?
3 июн 21, 20:33    [22331097]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Tavocer
Member

Откуда:
Сообщений: 41
Кесарь,
а STRING_SPLIT не работала, потому что не правильно применял, потом разобрался
3 июн 21, 20:35    [22331098]     Ответить | Цитировать Сообщить модератору
 Re: Разделить много текстовых строк на отдельные значения  [new]
Tavocer
Member

Откуда:
Сообщений: 41
Всем спасибо, разобрался

SELECT Distinct value
FROM tablica
CROSS APPLY STRING_SPLIT(stolbec, ' ')
ORDER BY value

Сообщение было отредактировано: 3 июн 21, 20:43
3 июн 21, 20:51    [22331102]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить