В состав находящейся в разработке ветки СУБД PostgreSQL 9.3 включен набор средств для обработки данных в формате JSON. Если в ветке PostgreSQL 9.2 появилась поддержка типа данных JSON, обеспечивающего хранение данных в согласованном виде, то в PostgreSQL 9.3 появятся встроенные средства для преобразования и манипуляции данными в формате JSON.
Новые возможности можно разделить на две категории:
- Функции для генерации данных в формате JSON из данных в других форматах: json_agg, to_json, hstore_to_json и hstore_to_json_loose;
postgres=# create table aa (a bool, b text); CREATE TABLE postgres=# INSERT INTO aa VALUES (true, 'Hello "Darling"'); INSERT 0 1 postgres=# INSERT INTO aa VALUES (false, NULL); INSERT 0 1 postgres=# SELECT to_json(a) AS bool_json, to_json(b) AS txt_json FROM aa; bool_json | txt_json -----------+--------------------- true | "Hello \"Darling\"" false | (2 rows) postgres=# SELECT json_agg(aa) FROM aa; json_agg --------------------------------------- [{"a":true,"b":"Hello \"Darling\""}, + {"a":false,"b":null}] (1 row) postgres=# CREATE TABLE aa (id int, txt hstore); CREATE TABLE postgres=# INSERT INTO aa VALUES (1, 'f1=>t, f2=>2, f3=>"Hi", f4=>NULL'); INSERT 0 1 postgres=# SELECT id, txt::json, hstore_to_json(txt) FROM aa; id | txt | hstore_to_json ----+-----------------------------------+-------------------------------- 1 | {"f1": "t", "f2": "2", "f3": "Hi", "f4": null} | {"f1": "t", "f2": "2", "f3": "Hi", "f4": null} (1 row)
- Встроенные операторы и функции для обработки JSON-данных, позволяющие извлекать поля, менять отдельные значения, создавать записи на основе JSON-данных. В частности, для извлечения содержимого элементов JSON добавлены операторы "->", "->>", "#>" и "#>>".
postgres=# SELECT b->>'f3' AS f1 FROM aa WHERE a = 1; f1 ---------------- Hi I'm "Daisy" (1 row) postgres=# SELECT b->'f3' AS f1 FROM aa WHERE a = 1; f1 -------------------- "Hi I'm \"Daisy\"" (1 row)
Для тех, кто желает начать использовать новые возможности не дожидаясь выхода PostgreSQL 9.3, указанные функции портированы для PostgreSQL 9.2 и опубликованы в форме внешнего дополнения.