11 мая 2023
Тэги: json, PostgreSQL, SQL.
JSON (JavaScript Object Notation) является форматом для хранения и передачи данных в форме объектов, массивов и других значений, которые можно легко преобразовать в текстовую строку. PostgreSQL поддерживает хранение данных в формате JSON, а также множество функций для обработки и анализа JSON-данных.
В PostgreSQL JSON может храниться в столбцах таблицы, при этом можно использовать индексы для ускорения поиска и запросов. Кроме того, в PostgreSQL есть возможность использовать операторы для извлечения и модификации данных в формате JSON.
В PostgreSQL есть два типа данных для работы с JSON: json и jsonb. Они отличаются друг от друга способом хранения данных и способом работы с ними.
Тип данных json использует текстовый формат хранения JSON-данных, который позволяет хранить только простые типы данных JSON: строки, числа, логические значения, null и массивы или объекты, состоящие только из этих типов. Это означает, что при хранении данных типа json не происходит никакой оптимизации, и любые изменения в данных приводят к перезаписи всей строки JSON.
Тип данных jsonb использует бинарный формат хранения JSON-данных, который позволяет хранить все типы данных JSON, включая вложенные объекты и массивы, а также дополнительные типы данных, такие как булевы значения, даты и времена и т.д. Бинарный формат данных jsonb позволяет эффективно хранить, индексировать и быстро выполнять запросы к данным в формате JSON, и при изменении данных не требует перезаписи всей строки JSON, а лишь тех частей, которые изменились.
В целом, использование типа данных jsonb является более предпочтительным в PostgreSQL, так как он позволяет более эффективно хранить и обрабатывать JSON-данные, а также более быстро выполнять запросы, связанные с ними. Поэтому далее будем рассматривать только jsonb.
Одной из основных функций для работы с JSON является jsonb_build_object(), которая позволяет создавать объекты JSON внутри запросов. Это может быть полезно, например, при импорте данных из внешних источников.
Предположим, что мы хотим в select-запросе динамически сгенерировать json-объект. Сделать это можно так:
Этот запрос создаст JSON-объект со свойствами name, age и city, которые будут содержать соответствующие значения. Результатом запроса будет следующий JSON-объект:
В PostgreSQL также можно использовать операторы -> и ->> для извлечения данных из JSON-объектов. Оператор -> возвращает значение по указанному ключу, а оператор ->> возвращает значение в форме текстовой строки. Рассмотрим это на примерах.
Тут мы динамически формируем json-объект из строки и приводим его к типу jsonb. Затем выбираем значение поля age. Поскольку здесь одинарная стрелка, то результат будет числом 30. Если же поставить двойную стрелку, то результат будет строкой «30».
Предположим, что есть у нас таблица people_table с информацией о пользователях.
Мы можем всё её содержимое преобразовать в один json, в котором будет список соответствующих объектов (один объект = одна строка в таблице).
В результате получим:
Давайте расширим таблицу people_table, добавив в неё новую колонку json_data. В эту колонку поместим все данные той же строки в формате json. Для того, чтобы к этой колонке можно было выполнять рассмотренные выше запросы, она должна иметь тип jsonb.
Теперь выполним sql-update, чтобы заполнить новый столбец:
Тут мы используем два подзапроса.
В итоге таблица примет следующий вид:
В целом, работа с JSON в PostgreSQL позволяет эффективно использовать возможности этого формата для обработки и анализа данных. PostgreSQL предоставляет широкий спектр функций для работы с JSON, что делает его очень гибким и мощным инструментом для работы с данными в формате JSON.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.