PostgreSQL | Как привести JSONB к массиву из строк без двойных кавычек по краям?

PostgreSQL | Как привести JSONB к массиву из строк без двойных кавычек по краям?

PostgreSQL — это какая-то «каша» из разных концепций языков программирования, слепленных в одну кучу. В одном месте индексы массивов начинаются с единицы, и тут же в другом месте индексы массивов начинаются уже с нуля. Это как пример убогости.

Так вот. Столкнулся с проблемой обратной конвертации ячейки из JSONB обратно в классический объект. В том же JavaScript есть всего два метода в JSON-строку и обратно в JS-объект — (stringify() и parse()).

Чтобы было понятнее, предлагаю ознакомиться с записью из таблицы, которая содержит тип jsonb от PostgreSQL. Запись является данными со страницы по какому-то адресу в интернете.

Одна запись с типом jsonb из таблицы в PostgreSQL
Одна запись с типом jsonb из таблицы в PostgreSQL

Развернув JSONB получаем такой набор данных:

jsonb содержит массивы из строк с двойными кавычками HTML-заголовков h1 - h6
jsonb содержит массивы из строк с двойными кавычками HTML-заголовков h1 — h6

Всего получается шесть ключей, которые соответствуют HTML-заголовкам.

 

Проблема с двойными кавычками в массиве из строк по ключу jsonb в PostgreSQL

Предположим, что мы хотим получить все возможные заголовки третьего уровня по стандарту HTML из этого jsonb.

Первое, что нам приходит в голову — это обратиться к нужному массиву по ключу ‘h3‘:

SELECT pagejson -> 'h3' FROM a.t_all_dp WHERE id = 317426404;

Результат:

Обратились к ключу h3 в jsonb в PostgreSQL
Обратились к ключу h3 в jsonb в PostgreSQL

После этого хочется привести полученный результат к массиву:

SELECT ARRAY(SELECT pagejson -> 'h3' FROM a.t_all_dp WHERE id = 317426404);
или
SELECT ARRAY(SELECT pagejson ->> 'h3' FROM a.t_all_dp WHERE id = 317426404);

Результат:

Привели значение ключа h3 к массиву из jsonb - PostgreSQL
Привели значение ключа h3 к массиву из jsonb — PostgreSQL
Привели значение ключа h3 к массиву из text - PostgreSQL
Привели значение ключа h3 к массиву из text — PostgreSQL

И вот тут нас постигает неудача, потому что обратная конвертация данных строк не приводит их к первоначальному состоянию БЕЗ ДВОЙНЫХ КАВЫЧЕК!

 

Получение массива строк без двойных кавычек по краям из ключа ячейки jsonb в PostgreSQL

Чтобы решить нашу задачу по получению массива из «чистых» строк, нужно воспользоваться функциями:

  1. jsonb_array_elements_text()
  2. array()

SQL-запрос будет выглядеть следующим образом:

SELECT ARRAY(SELECT jsonb_array_elements_text(pagejson #> '{h3}') FROM a.t_all_dp WHERE id = 317426404);
или
SELECT ARRAY(SELECT jsonb_array_elements_text(pagejson -> 'h3') FROM a.t_all_dp WHERE id = 317426404);

Внимание! Графический результат из интерфейса pgAdmin4:

Подстава от интерфейса pgAdmin4 - двойные кавычки отображаются некорректно
Подстава от интерфейса pgAdmin4 — двойные кавычки отображаются некорректно

В интерфейсе веб-оболочки pgAdmin4 мы получим вторую строку массива с двойными кавычками. Внимание! Это ошибка самого интерфейса, которую мы можем проверить иным образом (просто уберём приведения подзапроса к массиву):

SELECT jsonb_array_elements_text(pagejson #> '{h3}') FROM a.t_all_dp WHERE id = 317426404;
или
SELECT jsonb_array_elements_text(pagejson -> 'h3') FROM a.t_all_dp WHERE id = 317426404;

Табличный результат:

Получили табличный вариант заголовков из массива под ключом jsonb в PostgreSQL
Получили табличный вариант заголовков из массива под ключом jsonb в PostgreSQL

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org