PostgreSQL — это какая-то «каша» из разных концепций языков программирования, слепленных в одну кучу. В одном месте индексы массивов начинаются с единицы, и тут же в другом месте индексы массивов начинаются уже с нуля. Это как пример убогости.
Так вот. Столкнулся с проблемой обратной конвертации ячейки из JSONB обратно в классический объект. В том же JavaScript есть всего два метода в JSON-строку и обратно в JS-объект — (stringify() и parse()).
Чтобы было понятнее, предлагаю ознакомиться с записью из таблицы, которая содержит тип jsonb от PostgreSQL. Запись является данными со страницы по какому-то адресу в интернете.
Развернув JSONB получаем такой набор данных:
Всего получается шесть ключей, которые соответствуют HTML-заголовкам.
Проблема с двойными кавычками в массиве из строк по ключу jsonb в PostgreSQL
Предположим, что мы хотим получить все возможные заголовки третьего уровня по стандарту HTML из этого jsonb.
Первое, что нам приходит в голову — это обратиться к нужному массиву по ключу ‘h3‘:
SELECT pagejson -> 'h3' FROM a.t_all_dp WHERE id = 317426404;
Результат:
После этого хочется привести полученный результат к массиву:
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);
Результат:
И вот тут нас постигает неудача, потому что обратная конвертация данных строк не приводит их к первоначальному состоянию БЕЗ ДВОЙНЫХ КАВЫЧЕК!
Получение массива строк без двойных кавычек по краям из ключа ячейки jsonb в PostgreSQL
Чтобы решить нашу задачу по получению массива из «чистых» строк, нужно воспользоваться функциями:
- jsonb_array_elements_text()
- 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 мы получим вторую строку массива с двойными кавычками. Внимание! Это ошибка самого интерфейса, которую мы можем проверить иным образом (просто уберём приведения подзапроса к массиву):
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;
Табличный результат:
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org