powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нарезать строку на части
7 сообщений из 7, страница 1 из 1
Нарезать строку на части
    #39955830
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем здравствуйте.
Имеется
Код: sql
1.
Microsoft SQL Server 2017 (RTM-CU20) (KB4541283) - 14.0.3294.2 (X64)   Mar 13 2020 14:53:45   Copyright (C) 2017 Microsoft Corporation  Developer Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) 



и строки такого вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @InHistory TABLE
(
  HistoryText VARCHAR(200)
)
INSERT @InHistory(HistoryText)
SELECT '{  "1" :["1"], "2" :["3?тест123"], "3" :["4?20.03.2019"], "4" :["5?2000"], "7" :["21"], "8" :["24"], "9" :["28"] }'--String 1
UNION ALL
SELECT '{  "1" :["1"], "2" :["3?тест123"], "3" :[], "4" :[], "7" :["21"], "8" :["24"], "9" :["28"] }'--String 2



Их нужно распарсить в таблицу примерно такого вида (на примере String 1)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 1 AS FirstColumn,1 AS SecondColumn
   UNION ALL
SELECT 2 AS FirstColumn,3 AS SecondColumn
   UNION ALL
SELECT 3 AS FirstColumn, 4 AS SecondColumn
   UNION ALL
SELECT 4 AS FirstColumn, 5 AS SecondColumn
   UNION ALL
SELECT 7 AS FirstColumn,21 AS SecondColumn
  UNION ALL
SELECT 8 AS FirstColumn,24 AS SecondColumn
  UNION ALL
SELECT 9 AS FirstColumn,28 AS SecondColumn


Для String2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT  1 AS FirstColumn,1 AS SecondColumn
   UNION ALL
SELECT 2 AS FirstColumn,3 AS SecondColumn
   UNION ALL
SELECT 3 AS FirstColumn,0 AS SecondColumn
  UNION ALL
SELECT 4 AS FirstColumn,0 AS SecondColumn
  UNION ALL
SELECT 7 AS FirstColumn,21 AS SecondColumn
  UNION ALL
SELECT 8 AS FirstColumn,24 AS SecondColumn
  UNION ALL
SELECT 9 AS FirstColumn,28 AS SecondColumn


У меня получилось только сделать первый шаг:
Код: sql
1.
2.
3.
SELECT Z.VALUE
from @InHistory AS V
CROSS APPLY  STRING_SPLIT(V.HistoryText,',')Z;


Буду признателен за помощь, поскольку строковые функции - не моя стихия

С уважением, Londinium
...
Рейтинг: 0 / 0
Нарезать строку на части
    #39955836
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
londinium,

А в сторону openjson глянуть не хотите?
...
Рейтинг: 0 / 0
Нарезать строку на части
    #39955849
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
select
 t.HistoryText, a.[key], left(b.value, c.p)
from
 @InHistory t cross apply
 openjson(t.HistoryText) a cross apply
 openjson(a.value) b cross apply
 (select isnull(nullif(charindex('?', b.value), 0) - 1, cast(0x7fffffff as int))) c(p);
...
Рейтинг: 0 / 0
Нарезать строку на части
    #39955862
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА в сторону openjson глянуть не хотите?
в сторону OpenJSON смотрел, но опять стоит вопрос повыдергивать текст:
Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE @InString VARCHAR(200);
--SET @InString='{  "1" :["1"], "2" :["3?тест123"], "3" :[], "4" :[], "7" :["21"], "8" :["24"], "9" :["28"] }';
SET @InString='{  "1" :["1"], "2" :["3?тест123"], "3" :["4?20.03.2019"], "4" :["5?2000"], "7" :["21"], "8" :["24"], "9" :["28"] }'

SELECT ISJSON(@InString);--1

SELECT * FROM OPENJSON(@InString);



invm,
Спасибо за Ваш вариант. Очень сильно, но почему-то не ловит ( "3" :[], "4" :[],)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @InHistory TABLE
(
  HistoryText VARCHAR(200)
)
INSERT @InHistory(HistoryText)
SELECT '{  "1" :["1"], "2" :["3?тест123"], "3" :[], "4" :[], "7" :["21"], "8" :["24"], "9" :["28"] }'


select
 t.HistoryText, a.[key], left(b.value, c.p)
from
 @InHistory t cross apply
 openjson(t.HistoryText) a cross apply
 openjson(a.value) b cross apply
 (select isnull(nullif(charindex('?', b.value), 0) - 1, cast(0x7fffffff as int))) c(p);
...
Рейтинг: 0 / 0
Нарезать строку на части
    #39955869
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
londinium
но почему-то не ловит ( "3" :[], "4" :[],)
Код: sql
1.
2.
3.
4.
5.
6.
7.
select
 t.HistoryText, a.[key], left(b.value, c.p)
from
 @InHistory t cross apply
 openjson(t.HistoryText) a outer apply
 openjson(a.value) b cross apply
 (select isnull(nullif(charindex('?', b.value), 0) - 1, cast(0x7fffffff as int))) c(p);
...
Рейтинг: 0 / 0
Нарезать строку на части
    #39955875
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
спасибо. Выглядит очень-очень перспективно
...
Рейтинг: 0 / 0
Нарезать строку на части
    #39956017
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если у вас воспроизводимые ошибки в json, то возможно имеет смысл их поправить и работать потом как с обычным jsonом

типа такого

Код: 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.
27.
28.
29.
DECLARE @json NVARCHAR(MAX);
SET @json = N'
  {  "1" :["1"], "2" :["3?тест123"], "3" :["4?20.03.2019"], "4" :["5?2000"], "7" :["21"], "8" :["24"], "9" :["28"] },
  {  "1" :["1"], "2" :["3?тест123"], "3" :[], "4" :[], "7" :["21"], "8" :["24"], "9" :["28"] },
  {  "1" :["1"], "2" :["3?тест123"], "3" :[], "4" :[], "7" :["21"], "8" :["24"], "9" :["28"] }
';

-- атрибуты не могут начинаться с цифр, поэтому надо их заменить
select @json =  REPLACE(@json, '"1" :', '"a1" :');
select @json =  REPLACE(@json, '"2" :', '"a2" :');
--- итд

-- лишние скобки
select @json =  REPLACE(@json, '[', '');
select @json =  REPLACE(@json, ']', '');
--пустые значения
select @json =  REPLACE(@json, ':,', ':"",');

--завершаем массив
select @json = CONCAT('[',@json,']');

SELECT *
FROM OPENJSON(@json)
  WITH (
-- выбираем колонки
    a1 NVARCHAR(50) 'strict $.a1',
    a2 NVARCHAR(50) 'strict $.a2'

  );
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нарезать строку на части
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]