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

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

27.02.2024, 18:41. Показов 3066. Ответов 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
671 / 294 / 121
Регистрация: 12.04.2022
Сообщений: 1,005
01.03.2024, 09:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jack Famous Посмотреть сообщение
Collate базы не различает регистры
А причем здесь это.

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

Добавлено через 1 час 58 минут
Вариант от uaggster работает даже медленнее моей функции.
Итого(для меня): победитель метод, основанный на JSON_VALUE.
0
1307 / 361 / 98
Регистрация: 14.10.2022
Сообщений: 1,105
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
933 / 366 / 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
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
04.03.2024, 15:55
invm, крутил 20 секунд и выдал ошибку о недопустимом (имени в строке XML, кажется) что-то там.
Не годится
0
1307 / 361 / 98
Регистрация: 14.10.2022
Сообщений: 1,105
04.03.2024, 16:49
Цитата Сообщение от Jack Famous Посмотреть сообщение
Не годится
Годится, на самом деле. Нужно просто преобразовать текст к "содержимому тега xml" безопасным способом.
См:
T-SQL
1
(Select a.string as [data()] for xml path(''))
invm просто поленился.

Цитата Сообщение от Jack Famous Посмотреть сообщение
Но всё равно плохо: моя функция работает 2 секунды
Проблема в том, что это пользовательская функция.
Что вы сможете сделать, если вам не разрешено создавать функции?
:-)
0
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
04.03.2024, 17:56
Цитата Сообщение от uaggster Посмотреть сообщение
Что вы сможете сделать, если вам не разрешено создавать функции?
дык JSON же. Я ж писал. Он и быстрее в 2 раза почти.
0
1307 / 361 / 98
Регистрация: 14.10.2022
Сообщений: 1,105
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
933 / 366 / 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
1307 / 361 / 98
Регистрация: 14.10.2022
Сообщений: 1,105
05.03.2024, 10:41
:-)
Миниатюры
Распарсить строку  
0
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
05.03.2024, 10:45
Цитата Сообщение от uaggster Посмотреть сообщение
Замените какой-нибудь из символов - на ", и посмотрите, что получится.
не учёл))
Ну это не страшно, в принципе. Пока таких строк нет, а, если будут, то тогда и подумаем, как обработать.
Навскидку, заменить на допустимый символ, которого нет в строке и потом заменить обратно.
0
1307 / 361 / 98
Регистрация: 14.10.2022
Сообщений: 1,105
05.03.2024, 10:54
Ну, на самом деле, там не один такой символ, а кучка.
Поэтому, еще раз повторяю - строку нужно декорировать.
Т.е. преобразовать все недопустимые символы в символы, допустимые для значения тега json, ну или xml.
Для xml нужно проделать нечто подобное:
T-SQL
1
Select '<' for xml path('')
И делать реплейс уже в декорированном тексте. Причем и разделитель тоже придется подвергнуть декорации.
0
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
05.03.2024, 12:00
Цитата Сообщение от uaggster Посмотреть сообщение
Поэтому, еще раз повторяю - строку нужно декорировать.
Т.е. преобразовать все недопустимые символы в символы, допустимые для значения тега json, ну или xml.
не спорю, но такое нужно не всегда, а только, если в строке могут быть "запрещённые" символы.
Разумеется, нужно учитывать специфику работы инструмента. Моя функция, в этом плане, проще в использовании, а, с учётом "подготовки данных" для некоторых случаев, может стать и быстрее.
0
05.03.2024, 14:08

Не по теме:


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

0
933 / 366 / 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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru