Postgres: Как преобразовать строку json в текст?
Значение Json может состоять из значения жало. Например.
postgres=# SELECT to_json('Some "text"'::TEXT);
to_json
-----------------
"Some \"text\""
Как извлечь эту строку как текстовое значение postgres?
::TEXT
не работает. Он возвращает цитированный json, а не исходную строку:
postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
to_json
-----------------
"Some \"text\""
Спасибо.
P.S. I'm usnig PostgreSQL 9.3
Ответы
Ответ 1
В PostgreSQL нет возможности деконструировать скалярный объект JSON. Таким образом, как вы указываете,
select length(to_json('Some "text"'::TEXT) ::TEXT);
составляет 15,
Хитрость заключается в преобразовании JSON в массив одного элемента JSON, а затем извлечение этого элемента с помощью ->>
.
select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );
вернется 11.
Ответ 2
В 9.4.4 с помощью оператора #>>
работает для меня:
select to_json('test'::text) #>> '{}';
Для использования со столбцом таблицы:
select jsoncol #>> '{}' from mytable;
Ответ 3
Простой способ сделать это:
SELECT ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;
Просто преобразуйте строку json в список json
Ответ 4
Этот вопрос/решение порождает еще один вопрос... манифест для разработчиков PostgreSQL:
Зачем бросать JSON-строку в кавычки SQL-текста?
О, есть некоторые dillema... Почему бы не спросить пользователей, что они предпочитают?
В SQL литье char (N) производит ожидаемый текст без котировок; во встроенном языке или драйвере, литье SQL-текста создает ожидаемый строковый тип данных без кавычек, строка литья вызывает ожидаемый SQL-текст без котировок... Это универсальное ожидаемое поведение...