В состав находящейся в разработке ветки СУБД 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 и опубликованы в форме внешнего дополнения.