Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
3 / 3 / 0
Регистрация: 15.10.2018
Сообщений: 227

Распарсить строку

27.02.2024, 18:41. Показов 2820. Ответов 35

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток
Помогите решить задачку
Есть запрос который возвращает строку вида табл1
Подскажите как её распарсить что бы получить набор столбцов как в табл2 ?
Миниатюры
Распарсить строку  
Вложения
Тип файла: xlsx HierarchyCode.xlsx (8.0 Кб, 5 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.02.2024, 18:41
Ответы с готовыми решениями:

Распарсить строку на столбцы по разделителям
Доброго времени суток, форумчане. Прошу помочь с такой проблемой. Есть одна слитная строка с разделителями : ...

Распарсить JSON
В SQL Server в поле хранится значения такой структуры { "values": }]} Как можно получить значения элемента "id" - 123,...

Распарсить сложный XML
Добрый день! Возник вопрос: нужно распарсить XML средствами t-sql Сообщение приходит следующего вида: <root> <header> ...

35
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
01.03.2024, 09:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jack Famous Посмотреть сообщение
Collate базы не различает регистры
А причем здесь это.

value - Это метод типа данных XML
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
01.03.2024, 11:47
PaulWist, ваша правда — дело было именно в этом. Спасибо — не ожидал

Добавлено через 1 час 58 минут
Вариант от uaggster работает даже медленнее моей функции.
Итого(для меня): победитель метод, основанный на JSON_VALUE.
0
1304 / 358 / 97
Регистрация: 14.10.2022
Сообщений: 1,089
01.03.2024, 12:34
Цитата Сообщение от Jack Famous Посмотреть сообщение
Вариант от uaggster работает даже медленнее моей функции.
А вот так?
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Drop table if exists #t;
 
Create table #t(string nvarchar(max));
 
insert into #t
Select * from (Values
 (N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_OLK->FLORA_IND_2_T1')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_OLK->FLORA_IND_2_T3')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_OLK->FLORA_IND_2_T4')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T6')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T10')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T13')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T16')
,(N'1FLORA_EXP01->1FLORA_SER01')
) t(string)
 
Select b.x.value('(a/text())[1]', 'nvarchar(1000)') [1]
,b.x.value('(a/text())[2]', 'nvarchar(1000)') [2]
,b.x.value('(a/text())[3]', 'nvarchar(1000)') [3]
,b.x.value('(a/text())[4]', 'nvarchar(1000)') [4]
,b.x.value('(a/text())[5]', 'nvarchar(1000)') [5]
from #t a
    Cross apply (values (Cast(('<a>' + Replace((Select a.string as [data()] for xml path('')), (Select '->' as [data()] for xml path('')), '</a><a>') + '</a>') as xml))) b(x)
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
01.03.2024, 13:16
uaggster, в 3 раза быстрее). Было 20 секунд, стало 7.
Но всё равно плохо: моя функция работает 2 секунды (1,5 — если Collate добавить бинарный), а JSON — 1 секунду.
Если что, сплит строки в моём тесте идёт по 7ми полям.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
01.03.2024, 14:35
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Drop table if exists #t;
 
Create table #t(string nvarchar(max));
 
insert into #t
Select * from (Values
 (N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_OLK->FLORA_IND_2_T1')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_OLK->FLORA_IND_2_T3')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_OLK->FLORA_IND_2_T4')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T6')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T10')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T13')
,(N'FLORA_EXP01->FLORA_IND_2->FLORA_IND_2_T16')
,(N'1FLORA_EXP01->1FLORA_SER01')
) t(string)
 
select
 t.string
 , c.n.value('item[1]/@v', 'varchar(100)')
 , c.n.value('item[2]/@v', 'varchar(100)')
 , c.n.value('item[3]/@v', 'varchar(100)')
 , c.n.value('item[4]/@v', 'varchar(100)')
 from #t as t
cross apply (select '<items><item v="' + replace(t.string, '->', '"/><item v="') + '"/></items>') a(s)
cross apply (select cast(a.s as xml)) b(x)
cross apply b.x.nodes('items') c(n);
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
04.03.2024, 15:55
invm, крутил 20 секунд и выдал ошибку о недопустимом (имени в строке XML, кажется) что-то там.
Не годится
0
1304 / 358 / 97
Регистрация: 14.10.2022
Сообщений: 1,089
04.03.2024, 16:49
Цитата Сообщение от Jack Famous Посмотреть сообщение
Не годится
Годится, на самом деле. Нужно просто преобразовать текст к "содержимому тега xml" безопасным способом.
См:
T-SQL
1
(Select a.string as [data()] for xml path(''))
invm просто поленился.

Цитата Сообщение от Jack Famous Посмотреть сообщение
Но всё равно плохо: моя функция работает 2 секунды
Проблема в том, что это пользовательская функция.
Что вы сможете сделать, если вам не разрешено создавать функции?
:-)
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
04.03.2024, 17:56
Цитата Сообщение от uaggster Посмотреть сообщение
Что вы сможете сделать, если вам не разрешено создавать функции?
дык JSON же. Я ж писал. Он и быстрее в 2 раза почти.
0
1304 / 358 / 97
Регистрация: 14.10.2022
Сообщений: 1,089
04.03.2024, 18:20
И всё бы хорошо, но:
1. json только с 2016.
2. json тоже нужно предварительно декорировать.
Т.е. вот так - не работает:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Declare @YourTable Table ([SomeCol] varchar(50))  
Insert Into @YourTable Values 
 ('1000000-MER-MHO-GEN--------')
,('1000000-MER-MHO-GEN-MUS-------')
,('1000000-MER-MHO-GEN----RUG----')
,('1000000-MER-MHO-GEN--------VET')
 
Select A.* 
      ,Pos1  = JSON_VALUE(S,'$[0]')
      ,Pos2  = JSON_VALUE(S,'$[1]')
      ,Pos3  = JSON_VALUE(S,'$[2]')
      ,Pos4  = JSON_VALUE(S,'$[3]')
      ,Pos5  = JSON_VALUE(S,'$[4]')
      ,Pos6  = JSON_VALUE(S,'$[5]')
      ,Pos7  = JSON_VALUE(S,'$[6]')
      ,Pos8  = JSON_VALUE(S,'$[7]')
      ,Pos9  = JSON_VALUE(S,'$[8]')
      ,Pos10 = JSON_VALUE(S,'$[9]')
      ,Pos11 = JSON_VALUE(S,'$[10]')
      ,Pos12 = JSON_VALUE(S,'$[11]')
From @YourTable A
Cross Apply ( values ( '["'+replace(SomeCol,'-','","')+'"]' ) ) B(S)
Замените какой-нибудь из символов - на ", и посмотрите, что получится.
:-)
Выши предложения?
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
05.03.2024, 10:04
Проблема не обнаружена))
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Drop Table If Exists #t;
Create Table    #t(SomeCol NVarChar(1000));
Insert Into     #t(SomeCol) Values 
 ('1000000-MER-MHO-GEN--------')
,('1000000-MER-MHO-GEN-MUS-------')
,('1000000-MER-MHO-GEN----RUG----')
,('1000000-MER-MHO-GEN--------VET')
 
Select A.* 
      ,Pos1  = JSON_VALUE(S,'$[0]')
      ,Pos2  = JSON_VALUE(S,'$[1]')
      ,Pos3  = JSON_VALUE(S,'$[2]')
      ,Pos4  = JSON_VALUE(S,'$[3]')
      ,Pos5  = JSON_VALUE(S,'$[4]')
      ,Pos6  = JSON_VALUE(S,'$[5]')
      ,Pos7  = JSON_VALUE(S,'$[6]')
      ,Pos8  = JSON_VALUE(S,'$[7]')
      ,Pos9  = JSON_VALUE(S,'$[8]')
      ,Pos10 = JSON_VALUE(S,'$[9]')
      ,Pos11 = JSON_VALUE(S,'$[10]')
      ,Pos12 = JSON_VALUE(S,'$[11]')
From #t As A
Cross Apply ( values ( '["'+replace(SomeCol,'-','","')+'"]' ) ) As B(S)
0
1304 / 358 / 97
Регистрация: 14.10.2022
Сообщений: 1,089
05.03.2024, 10:41
:-)
Миниатюры
Распарсить строку  
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
05.03.2024, 10:45
Цитата Сообщение от uaggster Посмотреть сообщение
Замените какой-нибудь из символов - на ", и посмотрите, что получится.
не учёл))
Ну это не страшно, в принципе. Пока таких строк нет, а, если будут, то тогда и подумаем, как обработать.
Навскидку, заменить на допустимый символ, которого нет в строке и потом заменить обратно.
0
1304 / 358 / 97
Регистрация: 14.10.2022
Сообщений: 1,089
05.03.2024, 10:54
Ну, на самом деле, там не один такой символ, а кучка.
Поэтому, еще раз повторяю - строку нужно декорировать.
Т.е. преобразовать все недопустимые символы в символы, допустимые для значения тега json, ну или xml.
Для xml нужно проделать нечто подобное:
T-SQL
1
Select '<' for xml path('')
И делать реплейс уже в декорированном тексте. Причем и разделитель тоже придется подвергнуть декорации.
0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
05.03.2024, 12:00
Цитата Сообщение от uaggster Посмотреть сообщение
Поэтому, еще раз повторяю - строку нужно декорировать.
Т.е. преобразовать все недопустимые символы в символы, допустимые для значения тега json, ну или xml.
не спорю, но такое нужно не всегда, а только, если в строке могут быть "запрещённые" символы.
Разумеется, нужно учитывать специфику работы инструмента. Моя функция, в этом плане, проще в использовании, а, с учётом "подготовки данных" для некоторых случаев, может стать и быстрее.
0
05.03.2024, 14:08

Не по теме:


Работать с любым парсингом любого текста, это примерно как чистить квартиру после студенческой вечеринки.
- О! На антресолях насрали... Ну что за люди...
(С) Не моё. Но подписываюсь.

0
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
05.03.2024, 16:01
uaggster, я бы только уточнил "любого текста, который создан не по понятным алгоритмам"
Реально ХЗ что там может быть

UPD: я тут подумал, что можно в CTE сначала сделать запрос со значениями CharIndex для каждого разделителя (если их до 10ти в строке), а потом приджойнить её к исходной, добавив SubString на найденные позиции.
Но пробовать мне пока некогда)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2024, 16:01
Помогаю со студенческими работами здесь

Распарсить строку
Помогите написать запрос, в ячейке таблицы находится строка(типа Ia_НН1=&amp;35А Ib_НН1=&amp;36А Ic_НН1=&amp;37А), а из нее необходимо выделить...

Хранимые процедуры Postgres 9.3.3: распарсить строку
версия Postgres 9.3.3. Появилась необходимость распарсивать значение, передаваемое в базу посредством постгреса. подскажите, как это лучше...

Как распарсить строку в коллекцию или массив
Здравствуйте. С sql только начинаю дружить. Помогите советом или направьте в нужную сторону, пожалуйста. Есть таблица с числовым...

Распарсить значение ячейки
Товарищи, добрый день! имеется таблица, в одном столбце в некоторых ячейках данные представлены в виде диапазона цифр: 100-200 ...

Sql позволяет распарсить строки?
Доброго времени суток! Ситуация следующая: есть таблица, id // text 1 123 2 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru