Значение 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\""
Спасибо.
PS Я использую PostgreSQL 9.3
json
postgresql
e79ene
источник
источник
Ответы:
В 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.
источник
json_extract_path_text()
нельзя ссылаться на корневой элемент (AFAIK).from_json
получила предложенного, но не реализован wiki.postgresql.org/wiki/JSON_API_BrainstormВ 9.4.4
#>>
у меня работает оператор:select to_json('test'::text) #>> '{}';
Для использования со столбцом таблицы:
select jsoncol #>> '{}' from mytable;
источник
to_json(...)
это просто простой способ создать значение JSON для работы в качестве примера в коротком однострочном операторе. Конечно, вы бы заменили его именем столбца JSON, если бы запрашивали таблицу, как вы описываете. Кроме того, чтобы прояснить точку потенциальной путаницы, ваш приведение(...)::text
является избыточным, поскольку#>>
оператор возвращает текст по определению (и является причиной использования оператора в первую очередь). Вы можете оставить скобки, но не использовать приведение::text
.#>>
и'{}'
делаем? Я не совсем понимаю это, и ни один термин не подходит для Google. Этот ответ устранил мою проблему, я просто хочу знать, почему.#>>
оператора находится здесь .text
. Это может выглядеть как строка, но это объект JSON. Чтобы преобразовать этот объект из JSON в текст, используйте#>>
оператор. Но этому оператору нужно указать путь. Путь к этому корневому объекту -{}
. ЭтоSELECT '"test"'::jsonb #>> '{}'
означает «получить объект по корневому пути и преобразовать его в текст».Мистеру Кьюриусу это тоже было любопытно. Помимо
#>> '{}'
оператора, в 9.6+ можно получить значение строки jsonb с помощью->>
оператора:select to_jsonb('Some "text"'::TEXT)->>0; ?column? ------------- Some "text" (1 row)
Если у кого-то есть значение json, то решение состоит в том, чтобы сначала преобразовать его в jsonb:
select to_json('Some "text"'::TEXT)::jsonb->>0; ?column? ------------- Some "text" (1 row)
источник
Простой способ сделать это:
SELECT ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;
Просто преобразуйте строку json в список json
источник
- >> у меня работает.
версия postgres:
Запрос:
select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;
Выход:
источник
->
и->>
при его использовании. См. Этот ответ или этот ответ .