Не так страшен чёрт, каковым кажется на первый взгляд.

Раньше с некоторым недоверием относился ко всякого рода NoSQL базам и с подозрением смотрел на тип данных json. Но все меняется и оказалось, что за то время пока я сидел и присматривался - много чего родилось.

Например.

Отгружаем данные парсинга в MS SQL, в таблицу вида: `SELECT [ID] ,[Date] ,[DateTime] ,[DeveloperId] ,[TypeDataId] ,[JsonData] FROM [Parsing].[prs].[json_data]

В json_data содержится текст

`{ "project_id": "5", "project_title": "Большое Путилково", "min_price": "от 6,7 млн ?", "project_link": "/project/bolshoe-putilkovo/", "completion_date": "до 30.04.2027", "has_finishing": true, "flats_available": 308, "metro_stations": [ { "name": "Сходненская", "time": "10 мин.", "transport_type": "bus" }, { "name": "Пятницкое шоссе", "time": "10 мин.", "transport_type": "bus" }, { "name": "Планерная", "time": "10 мин.", "transport_type": "bus" }, { "name": "Митино", "time": "10 мин.", "transport_type": "bus" } ], "flat_types": [ { "type": "Студии", "min_area": "от 21,69 м?", "min_price": "6,7 млн ?" }, { "type": "1-комнатные", "min_area": "от 31,78 м?", "min_price": "8,2 млн ?" }, { "type": "2-комнатные", "min_area": "от 49,6 м?", "min_price": "11,9 млн ?" }, { "type": "3-комнатные", "min_area": "от 69,32 м?", "min_price": "16,5 млн ?" } ], "promotions": [ "-5% по промокоду SMLT55", "Новые корпуса", "Заселенные дома", "Семейная ипотека без наценки" ], "main_image": "https://media.samolet.ru/CACHE/images/project/card_image/%D0%9F%D1%83%D1%82%D0%B8%D0%BB%D0%BA%D0%BE%D0%B2%D0%BE_4_%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_%D0%B8%D0%BC%D0%B8%D0%B4%D0%B6_30-31_%D0%BA%D0%BE%D0%BF%D1%83%D1%81_%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9_%D0%BB%D0%B5%D1%82%D0%BD%D0%B8%D0%B9_%D0%B1%D0%B0%D0%BD%D0%B5%D1%80_%D0%BA%D1%80%D0%BE%D0%BF/6823e4070dea50b1e58f0cfdb1a8d149.jpg" }

Оказывается для добычи данных вполне себе можно воспользоваться встроенными функциями самого ms sql. Чтобы вытащить вообще все достаточно:

`SELECT -- Все исходные поля таблицы j.[ID], j.[Date], j.[DateTime], j.[DeveloperId], j.[TypeDataId], --j.[JsonData],

-- Распарсенные данные из JSON JSON_VALUE(j.JsonData, '$.project_id') AS project_id, JSON_VALUE(j.JsonData, '$.project_title') AS project_title, JSON_VALUE(j.JsonData, '$.min_price') AS project_min_price, JSON_VALUE(j.JsonData, '$.flats_available') AS flats_available, JSON_VALUE(j.JsonData, '$.completion_date') AS completion_date, JSON_VALUE(j.JsonData, '$.has_finishing') AS has_finishing,

-- Данные из вложенных массивов metro.name AS metro_name, metro.time AS metro_time, metro.transport_type,

flats.type AS flat_type, flats.min_area, flats.min_price AS flat_min_price,

promotions.promotion_list

FROM [Parsing].[prs].[json_data] j -- Распаковываем массивы CROSS APPLY OPENJSON(j.JsonData, '$.metro_stations') WITH ( name NVARCHAR(255) '$.name', time NVARCHAR(50) '$.time', transport_type NVARCHAR(50) '$.transport_type' ) AS metro

CROSS APPLY OPENJSON(j.JsonData, '$.flat_types') WITH ( type NVARCHAR(255) '$.type', min_area NVARCHAR(50) '$.min_area', min_price NVARCHAR(50) '$.min_price' ) AS flats

CROSS APPLY ( SELECT STRING_AGG(value, ', ') AS promotion_list FROM OPENJSON(j.JsonData, '$.promotions') ) AS promotions; И конечно всё это совершенно не нужно прописывать руками. Достаточно отгрузить любой нейронке промт со структурой таблицы и примером json текста.

Сегодня довольно серьезно удалось расширить арсенал способов хранения и использования данных.

Попробуйте - должно понравиться.```

repost

36

input message

напишите коммент

еще контент в этом сообществе

еще контент в этом соообществе

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь