9.15. ФÑнкÑии и опеÑаÑоÑÑ JSON
РТаблиÑе 9.43 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ, позволÑÑÑие ÑабоÑаÑÑ Ñ Ð´Ð²ÑÐ¼Ñ Ñипами даннÑÑ JSON (Ñм. Раздел 8.14).
ТаблиÑа 9.43. ÐпеÑаÑоÑÑ Ð´Ð»Ñ Ñипов json и jsonb
| ÐпеÑаÑÐ¾Ñ | Тип пÑавого опеÑанда | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ Ð¿ÑимеÑа |
|---|---|---|---|---|
-> | int | ÐÑдаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива JSON (по номеÑÑ Ð¾Ñ 0, оÑÑиÑаÑелÑнÑе ÑиÑла задаÑÑ Ð¿Ð¾Ð·Ð¸Ñии Ñ ÐºÐ¾Ð½Ñа) | '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 | {"c":"baz"} |
-> | text | ÐÑдаÑÑ Ð¿Ð¾Ð»Ðµ обÑекÑа JSON по клÑÑÑ | '{"a": {"b":"foo"}}'::json->'a' | {"b":"foo"} |
->> | int | ÐÑдаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива JSON в Ñипе text | '[1,2,3]'::json->>2 | 3 |
->> | text | ÐÑдаÑÑ Ð¿Ð¾Ð»Ðµ обÑекÑа JSON в Ñипе text | '{"a":1,"b":2}'::json->>'b' | 2 |
#> | text[] | ÐÑдаÑÑ Ð¾Ð±ÑÐµÐºÑ JSON по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи | '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' | {"c": "foo"} |
#>> | text[] | ÐÑдаÑÑ Ð¾Ð±ÑÐµÐºÑ JSON по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи в Ñипе text | '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' | 3 |
ÐÑимеÑание
ÐÑи опеÑаÑоÑÑ ÑÑÑеÑÑвÑÑÑ Ð² двÑÑ
ваÑиаÑиÑÑ
Ð´Ð»Ñ Ñипов json и jsonb. ÐпеÑаÑоÑÑ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ/ÑлеменÑа/пÑÑи возвÑаÑаÑÑ ÑÐ¾Ñ Ð¶Ðµ Ñип, ÑÑо Ñ Ð¾Ð¿ÐµÑанда Ñлева (json или jsonb), за иÑклÑÑением ÑеÑ
, ÑÑо возвÑаÑаÑÑ Ñип text (они возвÑаÑаÑÑ Ð·Ð½Ð°Ñение как ÑекÑÑовое). ÐÑли вÑ
однÑе даннÑе JSON не ÑодеÑÐ¶Ð°Ñ ÑÑÑÑкÑÑÑÑ, ÑдовлеÑвоÑÑÑÑей запÑоÑÑ, напÑÐ¸Ð¼ÐµÑ Ð² ниÑ
Ð½ÐµÑ Ð¸Ñкомого ÑлеменÑа, Ñо опеÑаÑоÑÑ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ/ÑлеменÑа/пÑÑи не вÑдаÑÑ Ð¾ÑибкÑ, а возвÑаÑаÑÑ NULL. ÐÑе опеÑаÑоÑÑ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ/ÑлеменÑа/пÑÑи, пÑинимаÑÑие ÑелоÑиÑленнÑе позиÑии в маÑÑиваÑ
JSON, поддеÑживаÑÑ Ð¸ оÑÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа маÑÑива по оÑÑиÑаÑелÑной позиÑии.
СÑандаÑÑнÑе опеÑаÑоÑÑ ÑÑавнениÑ, пÑиведÑннÑе в ТаблиÑе 9.1, еÑÑÑ Ð´Ð»Ñ Ñипа jsonb, но не Ð´Ð»Ñ json. Ðни ÑледÑÑÑ Ð¿Ñавилам ÑоÑÑиÑовки Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий B-деÑева, опиÑаннÑм в ÐодÑазделе 8.14.4. РРазделе 9.20 Ð²Ñ Ñакже можеÑе ÑзнаÑÑ Ð¾Ð± агÑегаÑной ÑÑнкÑии json_agg, коÑоÑÐ°Ñ Ð°Ð³ÑегиÑÑÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи в виде JSON, и агÑегаÑной ÑÑнкÑии json_object_agg, агÑегиÑÑÑÑей паÑÑ Ð·Ð½Ð°Ñений в обÑÐµÐºÑ JSON, а Ñакже иÑ
аналогаÑ
Ð´Ð»Ñ jsonb, ÑÑнкÑиÑÑ
jsonb_agg и jsonb_object_agg.
ÐекоÑоÑÑе из ÑледÑÑÑиÑ
опеÑаÑоÑов ÑÑÑеÑÑвÑÑÑ ÑолÑко Ð´Ð»Ñ jsonb, как показано в ТаблиÑе 9.44. Ðногие из ÑÑиÑ
опеÑаÑоÑов могÑÑ Ð±ÑÑÑ Ð¿ÑоиндекÑиÑÐ¾Ð²Ð°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов jsonb. Ðолное опиÑание пÑовеÑок на вÑ
ождение и ÑÑÑеÑÑвование Ð´Ð»Ñ jsonb пÑиведено в ÐодÑазделе 8.14.3. Ðак ÑÑи опеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑÑÑекÑивного индекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
jsonb, опиÑано в ÐодÑазделе 8.14.4.
ТаблиÑа 9.44. ÐополниÑелÑнÑе опеÑаÑоÑÑ jsonb
| ÐпеÑаÑÐ¾Ñ | Тип пÑавого опеÑанда | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ |
|---|---|---|---|
@> | jsonb | Ðевое знаÑение JSON ÑодеÑÐ¶Ð¸Ñ Ð½Ð° веÑÑ Ð½ÐµÐ¼ ÑÑовне пÑÑÑ/знаÑение JSON ÑпÑава? | '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb |
<@ | jsonb | ÐÑÑÑ/знаÑение JSON Ñлева ÑодеÑжиÑÑÑ Ð½Ð° веÑÑ Ð½ÐµÐ¼ ÑÑовне в пÑавом знаÑении JSON? | '{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb |
? | text | ÐÑиÑÑÑÑÑвÑÐµÑ Ð»Ð¸ ÑÑÑока в каÑеÑÑве клÑÑа веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð² знаÑении JSON? | '{"a":1, "b":2}'::jsonb ? 'b' |
?| | text[] | Ðакие-либо ÑÑÑоки маÑÑива пÑиÑÑÑÑÑвÑÑÑ Ð² каÑеÑÑве клÑÑей веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ? | '{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'c'] |
?& | text[] | ÐÑе ÑÑÑоки маÑÑива пÑиÑÑÑÑÑвÑÑÑ Ð² каÑеÑÑве клÑÑей веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ? | '["a", "b"]'::jsonb ?& array['a', 'b'] |
|| | jsonb | СоединÑÐµÑ Ð´Ð²Ð° знаÑÐµÐ½Ð¸Ñ jsonb в новое знаÑение jsonb | '["a", "b"]'::jsonb || '["c", "d"]'::jsonb |
- | text | УдалÑÐµÑ Ð¿Ð°ÑÑ ÐºÐ»ÑÑ/знаÑение или ÑлеменÑ-ÑÑÑÐ¾ÐºÑ Ð¸Ð· левого опеÑанда. ÐаÑÑ ÐºÐ»ÑÑ/знаÑение вÑбиÑаÑÑÑÑ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа. | '{"a": "b"}'::jsonb - 'a' |
- | text[] | УдалÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение или ÑлеменÑÑ-ÑÑÑоки из левого опеÑанда. ÐаÑÑ ÐºÐ»ÑÑ/знаÑение вÑбиÑаÑÑÑÑ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа. | '{"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[] |
- | integer | УдалÑÐµÑ Ð¸Ð· маÑÑива ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² заданной позиÑии (оÑÑиÑаÑелÑнÑе номеÑа позиÑий оÑÑÑиÑÑваÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа). ÐÑдаÑÑ Ð¾ÑибкÑ, еÑли конÑÐµÐ¹Ð½ÐµÑ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ â не маÑÑив. | '["a", "b"]'::jsonb - 1 |
#- | text[] | УдалÑÐµÑ Ð¿Ð¾Ð»Ðµ или ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм пÑÑÑм (Ð´Ð»Ñ Ð¼Ð°ÑÑивов JSON оÑÑиÑаÑелÑнÑе номеÑа позиÑий оÑÑÑиÑÑваÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа) | '["a", {"b":1}]'::jsonb #- '{1,b}' |
ÐÑимеÑание
ÐпеÑаÑÐ¾Ñ || ÑоединÑÐµÑ Ð´Ð²Ð° обÑекÑа JSON вмеÑÑе, ÑоÑмиÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ñ Ð¾Ð±ÑединÑннÑм набоÑом клÑÑей и знаÑений, пÑи ÑÑом в ÑлÑÑае ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей вÑбиÑаеÑÑÑ Ð·Ð½Ð°Ñение из вÑоÑого обÑекÑа. С лÑбÑми дÑÑгими аÑгÑменÑами ÑоÑмиÑÑеÑÑÑ Ð¼Ð°ÑÑив JSON: ÑнаÑала лÑбой аÑгÑменÑ, оÑлиÑнÑй Ð¾Ñ Ð¼Ð°ÑÑива, пÑеобÑазÑеÑÑÑ Ð² одноÑлеменÑнÑй маÑÑив, а заÑем два полÑÑеннÑÑ
маÑÑива ÑоединÑÑÑÑÑ. ÐÑа опеÑаÑÐ¸Ñ Ð½Ðµ ÑекÑÑÑивна â обÑединение пÑоизводиÑÑÑ ÑолÑко на веÑÑ
нем ÑÑовне ÑÑÑÑкÑÑÑÑ Ð¾Ð±ÑекÑа или маÑÑива.
РТаблиÑе 9.45 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, позволÑÑÑие ÑоздаваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñипов json и jsonb. (ÐÐ»Ñ Ñипа jsonb Ð½ÐµÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¾Ð² ÑÑнкÑий row_to_json и array_to_json, но пÑакÑиÑеÑки ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ to_jsonb.)
ТаблиÑа 9.45. ФÑнкÑии Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ JSON
| ФÑнкÑÐ¸Ñ | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ Ð¿ÑимеÑа |
|---|---|---|---|
| ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение в виде json или jsonb. ÐаÑÑÐ¸Ð²Ñ Ð¸ ÑоÑÑавнÑе ÑÑÑÑкÑÑÑÑ Ð¿ÑеобÑазÑÑÑÑÑ (ÑекÑÑÑивно) в маÑÑÐ¸Ð²Ñ Ð¸ обÑекÑÑ; Ð´Ð»Ñ Ð´ÑÑгиÑ
Ñипов, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
опÑеделено пÑиведение к json, пÑименÑеÑÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ð¿ÑиведениÑ, а Ð´Ð»Ñ Ð²ÑеÑ
оÑÑалÑнÑÑ
вÑдаÑÑÑÑ ÑкалÑÑное знаÑение. ÐнаÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑкалÑÑнÑÑ
Ñипов, кÑоме ÑиÑлового, логиÑеÑкого и NULL, пÑедÑÑавлÑÑÑÑÑ Ð² ÑекÑÑовом виде, в ÑÑиле, допÑÑÑимом Ð´Ð»Ñ Ð·Ð½Ð°Ñений json или jsonb. | to_json('Fred said "Hi."'::text) | "Fred said \"Hi.\"" |
array_to_json(anyarray [, pretty_bool]) | ÐозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив в виде маÑÑива JSON. ÐногомеÑнÑй маÑÑив PostgreSQL ÑÑановиÑÑÑ Ð¼Ð°ÑÑивом маÑÑивов JSON. ÐÑли паÑамеÑÑ pretty_bool Ñавен true, Ð¼ÐµÐ¶Ð´Ñ ÑлеменÑами 1-ой ÑазмеÑноÑÑи вÑÑавлÑÑÑÑÑ ÑазÑÑÐ²Ñ ÑÑÑок. | array_to_json('{{1,5},{99,100}}'::int[]) | [[1,5],[99,100]] |
row_to_json(record [, pretty_bool]) | ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾ÑÑеж в виде обÑекÑа JSON. ÐÑли паÑамеÑÑ pretty_bool Ñавен true, Ð¼ÐµÐ¶Ð´Ñ ÑлеменÑами 1-ой ÑазмеÑноÑÑи вÑÑавлÑÑÑÑÑ ÑазÑÑÐ²Ñ ÑÑÑок. | row_to_json(row(1,'foo')) | {"f1":1,"f2":"foo"} |
| ФоÑмиÑÑÐµÑ Ð¼Ð°ÑÑив JSON (возможно, ÑазноÑоднÑй) из пеÑеменного ÑпиÑка аÑгÑменÑов. | json_build_array(1,2,'3',4,5) | [1, 2, "3", 4, 5] |
| ФоÑмиÑÑÐµÑ Ð¾Ð±ÑÐµÐºÑ JSON из пеÑеменного ÑпиÑка аÑгÑменÑов. Ðо ÑоглаÑÐµÐ½Ð¸Ñ Ð² ÑÑом ÑпиÑке пеÑеÑиÑлÑÑÑÑÑ Ð¿Ð¾ оÑеÑеди клÑÑи и знаÑениÑ. | json_build_object('foo',1,'bar',2) | {"foo": 1, "bar": 2} |
| ФоÑмиÑÑÐµÑ Ð¾Ð±ÑÐµÐºÑ JSON из ÑекÑÑового маÑÑива. ÐÑÐ¾Ñ Ð¼Ð°ÑÑив должен имеÑÑ Ð»Ð¸Ð±Ð¾ Ð¾Ð´Ð½Ñ ÑазмеÑноÑÑÑ Ñ ÑÑÑнÑм ÑиÑлом ÑлеменÑов (в ÑÑом ÑлÑÑае они воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº ÑеÑедÑÑÑиеÑÑ ÐºÐ»ÑÑи/знаÑениÑ), либо две ÑазмеÑноÑÑи и пÑи ÑÑом каждÑй внÑÑÑенний маÑÑив ÑодеÑÐ¶Ð¸Ñ Ñовно два ÑлеменÑа, коÑоÑÑе воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº паÑа клÑÑ/знаÑение. |
| {"a": "1", "b": "def", "c": "3.5"} |
| ÐÑа ÑоÑма json_object пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÐºÐ»ÑÑи и знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ паÑам из двÑÑ
оÑделÑнÑÑ
маÑÑивов. Ðо вÑеÑ
оÑÑалÑнÑÑ
оÑноÑениÑÑ
она не оÑлиÑаеÑÑÑ Ð¾Ñ ÑоÑÐ¼Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ аÑгÑменÑом. | json_object('{a, b}', '{1,2}') | {"a": "1", "b": "2"} |
ÐÑимеÑание
ФÑнкÑии array_to_json и row_to_json Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ to_json, но пÑедлагаÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑлÑÑÑенного вÑвода. ÐейÑÑвие to_json, опиÑанное вÑÑе, ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° каждое оÑделÑное знаÑение, пÑеобÑазÑемое ÑÑими ÑÑнкÑиÑми.
ÐÑимеÑание
Ð ÑаÑÑиÑении hstore опÑеделено пÑеобÑазование из hstore в json, Ñак ÑÑо знаÑÐµÐ½Ð¸Ñ hstore, пÑеобÑазÑемÑе ÑÑнкÑиÑми ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ JSON, бÑдÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² виде обÑекÑов JSON, а не как пÑимиÑивнÑе ÑÑÑоковÑе знаÑениÑ.
РТаблиÑе 9.46 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñо знаÑениÑми json и jsonb.
ТаблиÑа 9.46. ФÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки JSON
| ФÑнкÑÐ¸Ñ | Тип ÑезÑлÑÑаÑа | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ Ð¿ÑимеÑа |
|---|---|---|---|---|
| int | ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑлеменÑов во внеÑнем маÑÑиве JSON. | json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]') | 5 |
|
| РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð²Ð½ÐµÑний обÑÐµÐºÑ JSON в Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение (key/value). | select * from json_each('{"a":"foo", "b":"bar"}') | key | value -----+------- a | "foo" b | "bar" |
| setof key text, value text | РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð²Ð½ÐµÑний обÑÐµÐºÑ JSON в Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение (key/value). ÐозвÑаÑаемÑе знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¸Ð¼ÐµÑÑ Ñип text. | select * from json_each_text('{"a":"foo", "b":"bar"}') | key | value -----+------- a | foo b | bar |
|
| ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение JSON по пÑÑи, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑлеменÑами пÑÑи (path_elems) (ÑавнознаÑно опеÑаÑоÑÑ #> operator). | json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4') | {"f5":99,"f6":"foo"} |
| text | ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение JSON по пÑÑи, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑлеменÑами пÑÑи path_elems, как text (ÑавнознаÑно опеÑаÑоÑÑ #>>). | json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4', 'f6') | foo |
| setof text | ÐозвÑаÑÐ°ÐµÑ Ð½Ð°Ð±Ð¾Ñ ÐºÐ»ÑÑей во внеÑнем обÑекÑе JSON. | json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') | json_object_keys ----------------- f1 f2 |
| anyelement | РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð· from_json в ÑаблиÑнÑÑ ÑÑÑокÑ, в коÑоÑой ÑÑолбÑÑ ÑооÑвеÑÑÑвÑÑÑ ÑÐ¸Ð¿Ñ ÑÑÑоки, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð°ÑамеÑÑом base (Ñм. пÑимеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). | select * from json_populate_record(null::myrowtype, '{"a": 1, "b": ["2", "a b"], "c": {"d": 4, "e": "a b c"}}') | a | b | c
---+-----------+-------------
1 | {2,"a b"} | (4,"a b c") |
| setof anyelement | РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð²Ð½ÐµÑний маÑÑив обÑекÑов из from_json в Ð½Ð°Ð±Ð¾Ñ ÑаблиÑнÑÑ
ÑÑÑок, в коÑоÑом ÑÑолбÑÑ ÑооÑвеÑÑÑвÑÑÑ ÑÐ¸Ð¿Ñ ÑÑÑоки, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð°ÑамеÑÑом base (Ñм. пÑимеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). | select * from json_populate_recordset(null::myrowtype, '[{"a":1,"b":2},{"a":3,"b":4}]') | a | b ---+--- 1 | 2 3 | 4 |
|
| РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑив JSON в Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений JSON. | select * from json_array_elements('[1,true, [2,false]]') | value ----------- 1 true [2,false] |
| setof text | РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑив JSON в Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений text. | select * from json_array_elements_text('["foo", "bar"]') | value ----------- foo bar |
| text | ÐозвÑаÑÐ°ÐµÑ Ñип внеÑнего знаÑÐµÐ½Ð¸Ñ JSON в виде ÑекÑÑовой ÑÑÑоки. ÐозможнÑе ÑипÑ: object, array, string, number, boolean и null. | json_typeof('-123.4') | number |
| record | ФоÑмиÑÑÐµÑ Ð¾Ð±ÑÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð· обÑекÑа JSON (Ñм. пÑимеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). Ðак и Ñо вÑеми ÑÑнкÑиÑми, возвÑаÑаÑÑими record, пÑи вÑзове необÑ
одимо Ñвно опÑеделиÑÑ ÑÑÑÑкÑÑÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ AS. | select * from json_to_record('{"a":1,"b":[1,2,3],"c":[1,2,3],"e":"bar","r": {"a": 123, "b": "a b c"}}') as x(a int, b text, c int[], d text, r myrowtype) | a | b | c | d | r
---+---------+---------+---+---------------
1 | [1,2,3] | {1,2,3} | | (123,"a b c") |
| setof record | ФоÑмиÑÑÐµÑ Ð¾Ð±ÑÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñей из маÑÑива обÑекÑа JSON (Ñм. пÑимеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). Ðак и Ñо вÑеми ÑÑнкÑиÑми, возвÑаÑаÑÑими record, пÑи вÑзове необÑ
одимо Ñвно опÑеделиÑÑ ÑÑÑÑкÑÑÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ AS. | select * from json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') as x(a int, b text); | a | b ---+----- 1 | foo 2 | |
|
| ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение from_json, из коÑоÑого иÑклÑÑаÑÑÑÑ Ð²Ñе Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа, ÑодеÑжаÑие знаÑÐµÐ½Ð¸Ñ NULL. ÐÑÑгие знаÑÐµÐ½Ð¸Ñ NULL оÑÑаÑÑÑÑ Ð½ÐµÑÑонÑÑÑми. | json_strip_nulls('[{"f1":1,"f2":null},2,null,3]') | [{"f1":1},2,null,3] |
|
| ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение target, в коÑоÑом Ñаздел Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм пÑÑÑм (path) заменÑеÑÑÑ Ð½Ð¾Ð²Ñм знаÑением (new_value), либо в него добавлÑеÑÑÑ Ð·Ð½Ð°Ñение new_value, еÑли аÑгÑÐ¼ÐµÐ½Ñ create_missing Ñавен true (ÑÑо знаÑение по ÑмолÑаниÑ) и ÑлеменÑ, на коÑоÑÑй ÑÑÑлаеÑÑÑ path, не ÑÑÑеÑÑвÑеÑ. Ðак и Ñ Ð¾Ð¿ÐµÑаÑоÑами, ÑаÑÑÑиÑаннÑми на пÑÑи, оÑÑиÑаÑелÑнÑе ÑиÑла в пÑÑи (path) обознаÑаÑÑ Ð¾ÑÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа маÑÑивов JSON. |
|
|
|
| ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение target Ñ Ð²ÑÑавленнÑм в него новÑм знаÑением new_value. ÐÑли меÑÑо в target, вÑбÑанное пÑÑÑм path, оказÑваеÑÑÑ Ð² маÑÑиве JSONB, new_value бÑÐ´ÐµÑ Ð²ÑÑавлен до (по ÑмолÑаниÑ) или поÑле (еÑли паÑамеÑÑ insert_after Ñавен true) вÑбÑанной позиÑии. ÐÑли меÑÑо в target, вÑбÑанное пÑÑÑм path, оказÑваеÑÑÑ Ð² обÑекÑе JSONB, знаÑение new_value бÑÐ´ÐµÑ Ð²ÑÑавлено в него, ÑолÑко еÑли заданнÑй пÑÑÑ path не ÑÑÑеÑÑвÑеÑ. Ðак и Ñ Ð¾Ð¿ÐµÑаÑоÑами, ÑаÑÑÑиÑаннÑми на пÑÑи, оÑÑиÑаÑелÑнÑе ÑиÑла в пÑÑи (path) обознаÑаÑÑ Ð¾ÑÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа маÑÑивов JSON. |
|
|
|
| ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение from_json в виде ÑекÑÑа JSON Ñ Ð¾ÑÑÑÑпами. | jsonb_pretty('[{"f1":1,"f2":null},2,null,3]') | [
{
"f1": 1,
"f2": null
},
2,
null,
3
] |
ÐÑимеÑание
Ðногие из ÑÑиÑ
ÑÑнкÑий и опеÑаÑоÑов пÑеобÑазÑÑÑ ÑпеÑпоÑледоваÑелÑноÑÑи Unicode в JSON-ÑÑÑокаÑ
в ÑооÑвеÑÑÑвÑÑÑие одиноÑнÑе ÑимволÑ. ÐÐ»Ñ Ð²Ñ
однÑÑ
даннÑÑ
Ñипа jsonb ÑÑо ниÑем не гÑозиÑ, Ñак как пÑеобÑазование Ñже вÑполнено; однако Ð´Ð»Ñ Ñипа json в ÑезÑлÑÑаÑе Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи оÑибка, как оÑмеÑено в Разделе 8.14.
ÐÑимеÑание
ФÑнкÑии json[b]_populate_record, json[b]_populate_recordset, json[b]_to_record и json[b]_to_recordset пÑинимаÑÑ Ð¾Ð±ÑÐµÐºÑ JSON или маÑÑив обÑекÑов и извлекаÑÑ Ð·Ð½Ð°ÑениÑ, ÑвÑзаннÑе Ñ ÐºÐ»ÑÑами, по именам, ÑооÑвеÑÑÑвÑÑÑим именам ÑÑолбÑов вÑÑ
одного Ñипа. ÐÐ¾Ð»Ñ Ð¾Ð±ÑекÑов, не ÑооÑвеÑÑÑвÑÑÑие никаким именам вÑÑ
однÑÑ
ÑÑолбÑов, игноÑиÑÑÑÑÑÑ, а вÑÑ
однÑе ÑÑолбÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
не наÑ
одÑÑÑÑ Ð¿Ð¾Ð»Ñ Ð² обÑекÑе, заполнÑÑÑÑÑ Ð·Ð½Ð°ÑениÑми NULL. ÐÐ»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ JSON в Ñип SQL вÑÑ
одного ÑÑолбÑа поÑледоваÑелÑно пÑименÑÑÑÑÑ ÑледÑÑÑие пÑавила:
ÐнаÑение NULL в JSON вÑегда пÑеобÑазÑеÑÑÑ Ð² SQL NULL.
ÐÑли вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð¼ÐµÐµÑ Ñип
jsonилиjsonb, знаÑение JSON воÑпÑоизводиÑÑÑ Ð±ÐµÐ· изменений.ÐÑли вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð¼ÐµÐµÑ ÑоÑÑавной Ñип (Ñип коÑÑежа) и знаÑение JSON ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом JSON, Ð¿Ð¾Ð»Ñ ÑÑого обÑекÑа пÑеобÑазÑÑÑÑÑ Ð² ÑÑолбÑÑ Ñипа вÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ коÑÑежа в ÑезÑлÑÑаÑе ÑекÑÑÑивного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð¿Ñавил.
ÐодобнÑм обÑазом, еÑли вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð¼ÐµÐµÑ Ñип-маÑÑив и знаÑение JSON пÑедÑÑавлÑÐµÑ Ð¼Ð°ÑÑив JSON, ÑлеменÑÑ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ маÑÑива пÑеобÑазÑÑÑÑÑ Ð² ÑлеменÑÑ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ маÑÑива в ÑезÑлÑÑаÑе ÑекÑÑÑивного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð¿Ñавил.
ÐÑли же знаÑение JSON ÑвлÑеÑÑÑ ÑÑÑоковой конÑÑанÑой, ÑодеÑжимое ÑÑой ÑÑÑоки пеÑедаÑÑÑÑ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ Ñелевого ÑÑолбÑа.
РпÑоÑивном ÑлÑÑае ÑÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ Ñелевого ÑÑолбÑа пеÑедаÑÑÑÑ Ð¾Ð±ÑÑное ÑекÑÑовое пÑедÑÑавление знаÑÐµÐ½Ð¸Ñ JSON.
ХоÑÑ Ð² пÑимеÑаÑ
иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑеÑиÑленнÑÑ
ÑÑнкÑий пÑименÑÑÑÑÑ ÐºÐ¾Ð½ÑÑанÑÑ, обÑÑно ÑÑи ÑÑнкÑии обÑаÑаÑÑÑÑ Ðº ÑаблиÑам в пÑедложении FROM, а в каÑеÑÑве аÑгÑменÑа ÑказÑваеÑÑÑ Ð¾Ð´Ð¸Ð½ из ÑÑолбÑов Ñипа json или jsonb. ÐзвлеÑÑннÑе знаÑÐµÐ½Ð¸Ñ Ð·Ð°Ñем могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² дÑÑгиÑ
ÑаÑÑÑÑ
запÑоÑа, напÑимеÑ, в пÑедложениÑÑ
WHERE и ÑезÑлÑÑиÑÑÑÑиÑ
ÑпиÑкаÑ
. ÐÐ·Ð²Ð»ÐµÐºÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво знаÑений подобнÑм обÑазом, можно знаÑиÑелÑно ÑвелиÑиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð¿Ð¾ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¸ÑполÑзованием опеÑаÑоÑов, ÑабоÑаÑÑиÑ
Ñ Ð¾ÑделÑнÑми клÑÑами.
ÐÑимеÑание
Ð target Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð²Ñе ÑлеменÑÑ Ð¿ÑÑи, заданного паÑамеÑÑом path ÑÑнкÑий jsonb_set и jsonb_insert, за иÑклÑÑением поÑледнего. ÐÑли create_missing Ñавен false, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð°Ð±ÑолÑÑно вÑе ÑлеменÑÑ Ð¿ÑÑи path, пеÑеданного ÑÑнкÑии jsonb_set. ÐÑли ÑÑо ÑÑловие не вÑполнÑеÑÑÑ, знаÑение target возвÑаÑаеÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½ÑннÑм.
ÐÑли поÑледним ÑлеменÑом пÑÑи оказÑваеÑÑÑ ÐºÐ»ÑÑ Ð¾Ð±ÑекÑа, он бÑÐ´ÐµÑ Ñоздан в ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¸ полÑÑÐ¸Ñ Ð½Ð¾Ð²Ð¾Ðµ знаÑение. ÐÑли поÑледний ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÑÑи â позиÑÐ¸Ñ Ð² маÑÑиве, Ñо когда она положиÑелÑна, Ñелевой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾ÑÑÑиÑÑваеÑÑÑ Ñлева, а когда оÑÑиÑаÑелÑна â ÑпÑава, Ñо еÑÑÑ -1 ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑамÑй пÑавÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ Ñ. д. ÐÑли позиÑÐ¸Ñ Ð»ÐµÐ¶Ð¸Ñ Ð²Ð½Ðµ диапазона -длина_маÑÑива .. длина_маÑÑива -1, и паÑамеÑÑ create_missing Ñавен true, новое знаÑение добавлÑеÑÑÑ Ð² наÑало маÑÑива, еÑли позиÑÐ¸Ñ Ð¾ÑÑиÑаÑелÑна, и в конеÑ, еÑли положиÑелÑна.
ÐÑимеÑание
ÐнаÑение null, возвÑаÑаемое ÑÑнкÑией json_typeof, не ÑледÑÐµÑ Ð¿ÑÑаÑÑ Ñ SQL NULL. Тогда как пÑи вÑзове json_typeof('null'::json) возвÑаÑаеÑÑÑ null, пÑи вÑзове json_typeof(NULL::json) бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑено знаÑение SQL NULL.
ÐÑимеÑание
ÐÑли аÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑии json_strip_nulls ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð¸Ð¼ÐµÐ½Ð° полей в лÑбом обÑекÑе, в ÑезÑлÑÑаÑе могÑÑ Ð¿ÑоÑвиÑÑÑÑ ÑеманÑиÑеÑкие ÑазлиÑиÑ, в завиÑимоÑÑи Ð¾Ñ Ð¿Ð¾ÑÑдка ÑÑиÑ
полей. ÐÑо не пÑоблема Ð´Ð»Ñ ÑÑнкÑии jsonb_strip_nulls, Ñак как в знаÑениÑÑ
jsonb имена полей не могÑÑ Ð´ÑблиÑоваÑÑÑÑ.