9.15. ФÑнкÑии и опеÑаÑоÑÑ JSON
Ð ÑÑом Ñазделе опиÑÑваÑÑÑÑ:
ÑÑнкÑии и опеÑаÑоÑÑ, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð´Ð°Ð½Ð½Ñми JSON
ÑзÑк пÑÑей SQL/JSON
ЧÑÐ¾Ð±Ñ ÑзнаÑÑ Ð±Ð¾Ð»ÑÑе о ÑÑандаÑÑе SQL/JSON, обÑаÑиÑеÑÑ Ðº [sqltr-19075-6]. Ð¢Ð¸Ð¿Ñ JSON, поддеÑживаемÑе в Postgres Pro, опиÑÐ°Ð½Ñ Ð² Разделе 8.14.
9.15.1. ÐбÑабоÑка и Ñоздание даннÑÑ JSON
ÐÑимеÑание
ФÑнкÑии, ÑабоÑаÑÑие Ñ JSONB, не пÑинимаÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ '\u0000'. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¾Ñибок и заменÑÑÑ Ð¸Ñ
на леÑÑ, необÑ
одимо ÑказаÑÑ Ñимвол Unicode в паÑамеÑÑе конÑигÑÑаÑии unicode_nul_character_replacement_in_jsonb.
РТаблиÑе 9.44 пеÑеÑиÑÐ»ÐµÐ½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ, коÑоÑÑе можно иÑполÑзоваÑÑ Ñ Ñипами даннÑÑ JSON (Ñм. Раздел 8.14).
ТаблиÑа 9.44. ÐпеÑаÑоÑÑ Ð´Ð»Ñ Ñипов json и jsonb
| ÐпеÑаÑÐ¾Ñ | Тип пÑавого опеÑанда | Тип ÑезÑлÑÑаÑа | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ Ð¿ÑимеÑа |
|---|---|---|---|---|---|
-> | int | json или jsonb | ÐÑдаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива JSON (по номеÑÑ Ð¾Ñ 0, оÑÑиÑаÑелÑнÑе ÑиÑла задаÑÑ Ð¿Ð¾Ð·Ð¸Ñии Ñ ÐºÐ¾Ð½Ñа) | '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 | {"c":"baz"} |
-> | text | json или jsonb | ÐÑдаÑÑ Ð¿Ð¾Ð»Ðµ обÑекÑа JSON по клÑÑÑ | '{"a": {"b":"foo"}}'::json->'a' | {"b":"foo"} |
->> | int | text | ÐÑдаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива JSON в Ñипе text | '[1,2,3]'::json->>2 | 3 |
->> | text | text | ÐÑдаÑÑ Ð¿Ð¾Ð»Ðµ обÑекÑа JSON в Ñипе text | '{"a":1,"b":2}'::json->>'b' | 2 |
#> | text[] | json или jsonb | ÐÑдаÑÑ Ð¾Ð±ÑÐµÐºÑ JSON по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи | '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' | {"c": "foo"} |
#>> | text[] | 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.45. Ðногие из ÑÑиÑ
опеÑаÑоÑов могÑÑ Ð±ÑÑÑ Ð¿ÑоиндекÑиÑÐ¾Ð²Ð°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов jsonb. Ðолное опиÑание пÑовеÑок на вÑ
ождение и ÑÑÑеÑÑвование Ð´Ð»Ñ jsonb пÑиведено в ÐодÑазделе 8.14.3. Ðак ÑÑи опеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑÑÑекÑивного индекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
jsonb, опиÑано в ÐодÑазделе 8.14.4.
ТаблиÑа 9.45. ÐополниÑелÑнÑе опеÑаÑоÑÑ 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}' |
@? | jsonpath | ÐÑдаÑÑ Ð»Ð¸ пÑÑÑ JSON какой-либо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON? | '{"a":[1,2,3,4,5]}'::jsonb @? '$.a[*] ? (@ > 2)' |
@@ | jsonpath | ÐозвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑовеÑки пÑедикаÑа пÑÑи JSON Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. ÐÑи ÑÑом ÑÑиÑÑваеÑÑÑ ÑолÑко пеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑезÑлÑÑаÑа. ÐÑли ÑезÑлÑÑÐ°Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑким, возвÑаÑаеÑÑÑ null. | '{"a":[1,2,3,4,5]}'::jsonb @@ '$.a[*] > 2' |
ÐÑимеÑание
ÐпеÑаÑÐ¾Ñ || ÑоединÑÐµÑ Ð´Ð²Ð° обÑекÑа JSON вмеÑÑе, ÑоÑмиÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ñ Ð¾Ð±ÑединÑннÑм набоÑом клÑÑей и знаÑений, пÑи ÑÑом в ÑлÑÑае ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей вÑбиÑаеÑÑÑ Ð·Ð½Ð°Ñение из вÑоÑого обÑекÑа. С лÑбÑми дÑÑгими аÑгÑменÑами ÑоÑмиÑÑеÑÑÑ Ð¼Ð°ÑÑив JSON: ÑнаÑала лÑбой аÑгÑменÑ, оÑлиÑнÑй Ð¾Ñ Ð¼Ð°ÑÑива, пÑеобÑазÑеÑÑÑ Ð² одноÑлеменÑнÑй маÑÑив, а заÑем два полÑÑеннÑÑ
маÑÑива ÑоединÑÑÑÑÑ. ÐÑа опеÑаÑÐ¸Ñ Ð½Ðµ ÑекÑÑÑивна â обÑединение пÑоизводиÑÑÑ ÑолÑко на веÑÑ
нем ÑÑовне ÑÑÑÑкÑÑÑÑ Ð¾Ð±ÑекÑа или маÑÑива.
ÐÑимеÑание
ÐпеÑаÑоÑÑ @? и @@ подавлÑÑÑ ÑледÑÑÑие оÑибки: оÑÑÑÑÑÑвие Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа или ÑлеменÑа маÑÑива, неÑовпадение Ñипа ÑлеменÑа JSON и ÑиÑловÑе оÑибки. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, когда нÑжно пÑоизвеÑÑи поиÑк по набоÑÑ Ð´Ð¾ÐºÑменÑов JSON, имеÑÑиÑ
ÑазлиÑнÑÑ ÑÑÑÑкÑÑÑÑ.
РТаблиÑе 9.46 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, позволÑÑÑие ÑоздаваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñипов json и jsonb. (ÐÐ»Ñ Ñипа jsonb Ð½ÐµÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¾Ð² ÑÑнкÑий row_to_json и array_to_json, но пÑакÑиÑеÑки ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ to_jsonb.)
ТаблиÑа 9.46. ФÑнкÑии Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ JSON
| ФÑнкÑÐ¸Ñ | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ Ð¿ÑимеÑа |
|---|---|---|---|
| ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение в виде json или jsonb. ÐаÑÑÐ¸Ð²Ñ Ð¸ ÑоÑÑавнÑе ÑÑÑÑкÑÑÑÑ Ð¿ÑеобÑазÑÑÑÑÑ (ÑекÑÑÑивно) в маÑÑÐ¸Ð²Ñ Ð¸ обÑекÑÑ; Ð´Ð»Ñ Ð´ÑÑгиÑ
Ñипов, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
опÑеделено пÑиведение к json, пÑименÑеÑÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ð¿ÑиведениÑ, а Ð´Ð»Ñ Ð²ÑеÑ
оÑÑалÑнÑÑ
вÑдаÑÑÑÑ ÑкалÑÑное знаÑение. ÐнаÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑкалÑÑнÑÑ
Ñипов, кÑоме ÑиÑлового, логиÑеÑкого и NULL, пÑедÑÑавлÑÑÑÑÑ Ð² ÑекÑÑовом виде, в ÑÑиле, допÑÑÑимом Ð´Ð»Ñ Ð·Ð½Ð°Ñений json или jsonb. | to_json('Fred said "Hi."'::text) | "Fred said \"Hi.\"" |
array_to_json(anyarray [, pretty_bool]) | ÐозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив в виде маÑÑива JSON. ÐногомеÑнÑй маÑÑив Postgres Pro ÑÑановиÑÑÑ Ð¼Ð°ÑÑивом маÑÑивов 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.47 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñо знаÑениÑми json и jsonb.
ТаблиÑа 9.47. ФÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки 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 (Ñм. пÑимеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). |
| a | b | c
---+-----------+-------------
1 | {2,"a b"} | (4,"a b c") |
| setof anyelement | РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð²Ð½ÐµÑний маÑÑив обÑекÑов из from_json в Ð½Ð°Ð±Ð¾Ñ ÑаблиÑнÑÑ
ÑÑÑок, в коÑоÑом ÑÑолбÑÑ ÑооÑвеÑÑÑвÑÑÑ ÑÐ¸Ð¿Ñ ÑÑÑоки, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð°ÑамеÑÑом base (Ñм. пÑимеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). |
| 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. |
| 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
] |
| boolean | ÐпÑеделÑеÑ, вÑдаÑÑ Ð»Ð¸ пÑÑÑ JSON какой-либо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ñи заданном знаÑении JSON. |
|
|
| boolean | ÐозвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑовеÑки пÑедикаÑа пÑÑи JSON Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. ÐÑи ÑÑом ÑÑиÑÑваеÑÑÑ ÑолÑко пеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑезÑлÑÑаÑа. ÐÑли ÑезÑлÑÑÐ°Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑким, возвÑаÑаеÑÑÑ null. |
|
|
| setof jsonb | ÐозвÑаÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ JSON, коÑоÑÑе вÑдаÑÑ Ð¿ÑÑÑ JSON Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. |
| jsonb_path_query ------------------ 2 3 4 |
| jsonb | ÐозвÑаÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ JSON, коÑоÑÑе вÑдаÑÑ Ð¿ÑÑÑ JSON Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON, обоÑаÑÐ¸Ð²Ð°Ñ Ð¸Ñ Ð² маÑÑив. |
|
|
| jsonb | ÐозвÑаÑÐ°ÐµÑ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ JSON, коÑоÑÑй вÑдаÑÑÑÑ Ð²ÑÑажением пÑÑи Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. Ð ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ ÑезÑлÑÑаÑов возвÑаÑÐ°ÐµÑ NULL. |
|
|
ÐÑимеÑание
Ðногие из ÑÑиÑ
ÑÑнкÑий и опеÑаÑоÑов пÑеобÑазÑÑÑ ÑпеÑпоÑледоваÑелÑноÑÑи 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 имена полей не могÑÑ Ð´ÑблиÑоваÑÑÑÑ.
ÐÑимеÑание
ФÑнкÑии jsonb_path_exists, jsonb_path_match, jsonb_path_query, jsonb_path_query_array и jsonb_path_query_first пÑинимаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑно необÑзаÑелÑнÑе аÑгÑменÑÑ vars и silent.
РаÑгÑменÑе vars можно пеÑедаÑÑ Ð¾Ð±ÑекÑ, ÑодеÑжаÑий именованнÑе пеÑеменнÑе, коÑоÑÑе бÑдÑÑ Ð¿Ð¾Ð´ÑÑавлÑÑÑÑÑ Ð² вÑÑажение jsonpath.
ÐÑли пеÑедаÑÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ silent и он Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, ÑÑи ÑÑнкÑии подавлÑÑÑ Ñе же оÑибки, ÑÑо и опеÑаÑоÑÑ @? и @@.
9.15.2. ЯзÑк пÑÑей SQL/JSON
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей SQL/JSON опÑеделÑÑÑ ÑлеменÑÑ, извлекаемÑе из даннÑÑ
JSON, подобно ÑомÑ, как вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath позволÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð¸Ð· SQL к XML. Ð Postgres Pro вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей пÑедÑÑавлÑÑÑÑÑ Ð² виде Ñипа даннÑÑ
jsonpath и могÑÑ Ð¸ÑполÑзоваÑÑ Ð»ÑбÑе ÑлеменÑÑ, опиÑаннÑе в ÐодÑазделе 8.14.6.
ÐпеÑаÑоÑÑ Ð¸ ÑÑнкÑии запÑоÑов к JSON пеÑедаÑÑ Ð¿Ð¾ÑÑÑпивÑее им вÑÑажение обÑабоÑÑÐ¸ÐºÑ Ð¿ÑÑей Ð´Ð»Ñ Ð²ÑÑиÑлениÑ. ÐÑли вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑ ÑигÑÑиÑÑÑÑие в запÑоÑе даннÑе JSON, в ÑезÑлÑÑаÑе вÑдаÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ SQL/JSON. ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей запиÑÑваÑÑÑÑ Ð½Ð° ÑзÑке SQL/JSON и могÑÑ Ð²ÐºÐ»ÑÑаÑÑ ÑложнÑе аÑиÑмеÑиÑеÑкие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ÑÑнкÑии. ФÑнкÑии запÑоÑов пÑинимаÑÑ Ñакие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² виде ÑекÑÑовÑÑ ÑÑÑок, поÑÑÐ¾Ð¼Ñ Ð¸Ñ Ð½Ñжно заклÑÑаÑÑ Ð² апоÑÑÑоÑÑ.
ÐÑÑажение пÑÑи ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· поÑледоваÑелÑноÑÑи ÑлеменÑов, допÑÑÑимÑÑ
Ð´Ð»Ñ Ñипа jsonpath. ÐÑÑиÑлÑеÑÑÑ Ð¾Ð½Ð¾ Ñлева напÑаво, но пÑи необÑ
одимоÑÑи поÑÑдок опеÑаÑий можно измениÑÑ, добавив Ñкобки. Ð ÑлÑÑае ÑÑпеÑного вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑдаÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÑлеменÑов SQL/JSON (поÑледоваÑелÑноÑÑÑ SQL/JSON), и ÑезÑлÑÑÐ°Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð² ÑÑнкÑÐ¸Ñ JSON-запÑоÑа, коÑоÑÐ°Ñ Ð·Ð°Ð²ÐµÑÑÐ°ÐµÑ Ð¾Ð±ÑабоÑÐºÑ Ð²ÑÑажениÑ.
ÐÐ»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº поÑÑÑпивÑим в запÑÐ¾Ñ Ð´Ð°Ð½Ð½Ñм JSON (ÑлеменÑÑ ÐºÐ¾Ð½ÑекÑÑа) в вÑÑажении пÑÑи иÑполÑзÑеÑÑÑ Ð·Ð½Ð°Ðº $. Ðа ним могÑÑ ÑледоваÑÑ Ð¾Ð´Ð¸Ð½ или более опеÑаÑоÑов обÑаÑениÑ, коÑоÑÑе, опÑÑкаÑÑÑ Ð² ÑÑÑÑкÑÑÑе JSON Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð½Ð° дÑÑгой, извлекаÑÑ Ð²Ð½ÑÑÑеннее ÑодеÑжимое ÑлеменÑа конÑекÑÑа. ÐÑи ÑÑом каждÑй поÑледÑÑÑий опеÑаÑÐ¾Ñ Ð¸Ð¼ÐµÐµÑ Ð´ÐµÐ»Ð¾ Ñ ÑезÑлÑÑаÑом вÑÑиÑлениÑ, полÑÑеннÑм на пÑедÑдÑÑем Ñаге.
ÐапÑимеÑ, пÑедположим, ÑÑо Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð´Ð°Ð½Ð½Ñе JSON, полÑÑеннÑе Ð¾Ñ GPS-ÑÑекеÑа, коÑоÑÑе Ð²Ñ Ñ Ð¾Ñели Ð±Ñ Ð¿ÑоанализиÑоваÑÑ:
{
"track": {
"segments": [
{
"location": [ 47.763, 13.4034 ],
"start time": "2018-10-14 10:05:14",
"HR": 73
},
{
"location": [ 47.706, 13.2635 ],
"start time": "2018-10-14 10:39:21",
"HR": 135
}
]
}
}ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð¼ÐµÑÑиеÑÑ ÑегменÑÑ ÑÑеков, воÑполÑзÑйÑеÑÑ Ð¾Ð¿ÐµÑаÑоÑом обÑаÑÐµÐ½Ð¸Ñ ., пÑименÑÑ ÐµÐ³Ð¾ ко вÑем пÑедÑеÑÑвÑÑÑим ÑлеменÑам JSON: клÑÑ
'$.track.segments'
ÐÑли Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÐ¼Ð°Ñ ÑÑÑноÑÑÑ ÑвлÑеÑÑÑ ÑлеменÑом маÑÑива, ÑÑÐ¾Ñ Ð¼Ð°ÑÑив нÑжно ÑазвеÑнÑÑÑ, воÑполÑзовавÑиÑÑ Ð¾Ð¿ÐµÑаÑоÑом [*]. ÐапÑимеÑ, ÑледÑÑÑий пÑÑÑ Ð²ÑдаÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ ÐºÐ¾Ð½Ñов вÑеÑ
имеÑÑиÑ
ÑÑ ÑегменÑов ÑÑеков:
'$.track.segments[*].location'
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ ÑолÑко пеÑвого ÑегменÑа, можно задаÑÑ ÑооÑвеÑÑÑвÑÑÑий Ð¸Ð½Ð´ÐµÐºÑ Ð² опеÑаÑоÑе обÑаÑÐµÐ½Ð¸Ñ []. ÐамеÑÑÑе, ÑÑо индекÑÑ Ð¼Ð°ÑÑивов в SQL/JSON оÑÑÑиÑÑваÑÑÑÑ Ñ 0:
'$.track.segments[0].location'
РезÑлÑÑÐ°Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñага вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑабоÑан опеÑаÑоÑами и меÑодами jsonpath, пеÑеÑиÑленнÑми в ÐодÑазделе 9.15.2.3. ÐеÑед именем меÑода должна ÑÑоÑÑÑ ÑоÑка. ÐапÑимеÑ, Ñак можно полÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива:
'$.track.segments.size()'
ÐополниÑелÑнÑе пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов и меÑодов jsonpath в вÑÑажениÑÑ
пÑÑи пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² ÐодÑазделе 9.15.2.3.
ÐпÑеделÑÑ Ð¿ÑÑÑ, Ñакже можно иÑполÑзоваÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа, ÑабоÑаÑÑие подобно пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE в SQL. ÐÑÑажение ÑилÑÑÑа наÑинаеÑÑÑ Ñо знака вопÑоÑа и ÑодеÑÐ¶Ð¸Ñ ÑÑловие в ÑкобкаÑ
:
? (ÑÑловие)ÐÑÑажение ÑилÑÑÑа должно ÑказÑваÑÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ñага вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи, к коÑоÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ пÑименÑеÑÑÑ. РезÑлÑÑаÑÑ ÑÑого Ñага пÑоÑ
одÑÑ ÑеÑез ÑилÑÑÑ, и на вÑÑ
оде оÑÑаÑÑÑÑ ÑолÑко Ñе ÑлеменÑÑ, коÑоÑÑе ÑдовлеÑвоÑÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑловиÑ. Ð SQL/JSON дейÑÑвÑÐµÑ ÑÑоиÑÐ½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ°, Ñо еÑÑÑ ÑезÑлÑÑаÑом вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ true, false или unknown (неизвеÑÑноÑÑÑ). ÐнаÑение unknown игÑÐ°ÐµÑ ÑÑ Ð¶Ðµ ÑолÑ, ÑÑо и NULL в SQL, и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑовеÑено пÑедикаÑом is unknown. Ðа поÑледÑÑÑиÑ
ÑагаÑ
вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÑолÑко Ñе ÑлеменÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
вÑÑажение ÑилÑÑÑа вÑдало true.
ФÑнкÑии и опеÑаÑоÑÑ, коÑоÑÑе можно иÑполÑзоваÑÑ Ð² вÑÑажениÑÑ
ÑилÑÑÑа, пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 9.49. РезÑлÑÑÐ°Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи, пÑоÑ
одÑÑий ÑеÑез ÑилÑÑÑ, пÑедÑÑавлÑеÑÑÑ Ð¿ÐµÑеменной @. ЧÑÐ¾Ð±Ñ Ð¾Ð±ÑаÑиÑÑÑÑ Ðº ÑлеменÑÑ JSON, наÑ
одÑÑемÑÑÑ Ð½Ð° более низком ÑÑовне вложенноÑÑи, добавÑÑе поÑле @ один или неÑколÑко опеÑаÑоÑов обÑаÑениÑ.
ÐÑедположим, ÑÑо Ð²Ñ Ñ Ð¾ÑиÑе полÑÑиÑÑ Ð²Ñе показаÑели пÑлÑÑа, пÑевÑÑаÑÑие 130. ÐÑо можно ÑделаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑледÑÑÑего вÑÑажениÑ:
'$.track.segments[*].HR ? (@ > 130)'
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð² ÑезÑлÑÑаÑе вмеÑÑо пÑлÑÑа вÑÐµÐ¼Ñ Ð½Ð°Ñала ÑооÑвеÑÑÑвÑÑÑего ÑегменÑа, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑÑилÑÑÑоваÑÑ Ð½ÐµÐ½ÑжнÑе ÑегменÑÑ, а заÑем вÑбÑаÑÑ Ð²ÑемÑ, Ñак ÑÑо ÑилÑÑÑ Ð±ÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ðº пÑедÑдÑÑÐµÐ¼Ñ ÑÐ°Ð³Ñ Ð¸ пÑÑÑ Ð¾ÐºÐ°Ð¶ÐµÑÑÑ Ð´ÑÑгим:
'$.track.segments[*] ? (@.HR > 130)."start time"'
Ðожно Ñакже иÑполÑзоваÑÑ Ð½ÐµÑколÑко вÑÑажений ÑилÑÑÑа на одном ÑÑовне, когда ÑÑо ÑÑебÑеÑÑÑ. ÐапÑимеÑ, ÑледÑÑÑее вÑÑажение вÑбиÑÐ°ÐµÑ Ð²Ñе ÑегменÑÑ Ñ Ð¾Ð¿ÑеделÑннÑми кооÑдинаÑами и вÑÑоким показаÑелем пÑлÑÑа:
'$.track.segments[*] ? (@.location[1] < 13.4) ? (@.HR > 130)."start time"'
Также возможно иÑполÑзоваÑÑ ÑилÑÑÑÑ Ð½Ð° ÑазнÑÑ ÑÑовнÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи. Ð ÑледÑÑÑем пÑимеÑе ÑнаÑала ÑегменÑÑ ÑилÑÑÑÑÑÑÑÑ Ð¿Ð¾ кооÑдинаÑам, а заÑем Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ ÑегменÑов, еÑли они Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ, вÑбиÑаÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²ÑÑокого пÑлÑÑа:
'$.track.segments[*] ? (@.location[1] < 13.4).HR ? (@ > 130)'
Ðожно Ñакже вкладÑваÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа одно в дÑÑгое:
'$.track ? (exists(@.segments[*] ? (@.HR > 130))).segments.size()'
Ðанное вÑÑажение возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑегменÑов в ÑÑеке, еÑли он ÑодеÑÐ¶Ð¸Ñ ÑегменÑÑ Ñ Ð²ÑÑокими показаÑелÑми пÑлÑÑа, или пÑÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ, еÑли ÑÐ°ÐºÐ¸Ñ ÑегменÑов неÑ.
РеализаÑÐ¸Ñ ÑзÑка пÑÑей SQL/JSON в Postgres Pro Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑие оÑлиÑÐ¸Ñ Ð¾Ñ ÑÑандаÑÑа SQL/JSON:
ÐеÑод
.datetime()еÑÑ Ð½Ðµ Ñеализован, поÑÐ¾Ð¼Ñ ÑÑо поÑÑоÑннÑе ÑÑнкÑии и опеÑаÑоÑÑjsonpathне могÑÑ Ð¸ÑполÑзоваÑÑ ÑаÑовой поÑÑ ÑекÑÑего ÑеанÑа, а ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ в некоÑоÑÑÑ Ð¾Ð¿ÐµÑаÑиÑÑ Ñ Ð´Ð°Ñой/вÑеменем. ÐоддеÑжка даÑ/вÑемени бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° вjsonpathв бÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ Postgres Pro.ÐÑÑажение пÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±ÑлевÑм пÑедикаÑом, Ñ Ð¾ÑÑ ÑÑандаÑÑ SQL/JSON допÑÑÐºÐ°ÐµÑ Ð¿ÑедикаÑÑ ÑолÑко в ÑилÑÑÑÐ°Ñ . ÐÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ ÑеализаÑии опеÑаÑоÑа
@@. ÐапÑимеÑ, ÑледÑÑÑее вÑÑажениеjsonpathдопÑÑкаеÑÑÑ Ð² Postgres Pro:'$.track.segments[*].HR < 70'
ÐÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие ÑазлиÑÐ¸Ñ Ð² инÑеÑпÑеÑаÑии Ñаблонов ÑегÑлÑÑнÑÑ Ð²ÑÑажений, иÑполÑзÑемÑÑ Ð² ÑилÑÑÑаÑ
like_regex; имеÑÑиеÑÑ Ð¾ÑобенноÑÑи опиÑÐ°Ð½Ñ Ð² ÐодÑазделе 9.15.2.2.
9.15.2.1. СÑÑогий и неÑÑÑогий ÑежимÑ
Ðогда Ð²Ñ Ð¾Ð±ÑаÑаеÑеÑÑ Ðº даннÑм JSON, вÑÑажение пÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑооÑвеÑÑÑвоваÑÑ ÑакÑиÑеÑкой ÑÑÑÑкÑÑÑе даннÑÑ JSON. ÐопÑÑка обÑаÑиÑÑÑÑ Ðº неÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÑÐ»ÐµÐ½Ñ Ð¾Ð±ÑекÑа или ÑлеменÑÑ Ð¼Ð°ÑÑива пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑибке ÑÑÑÑкÑÑÑного Ñипа. ÐÐ»Ñ Ð¾Ð±ÑабоÑки Ñакого Ñода оÑибок в вÑÑажениÑÑ Ð¿ÑÑей SQL/JSON пÑедÑÑмоÑÑÐµÐ½Ñ Ð´Ð²Ð° Ñежима:
lax (по ÑмолÑаниÑ) â неÑÑÑогий Ñежим, в коÑоÑом обÑабоÑÑик пÑÑей неÑвно адапÑиÑÑÐµÑ Ð¾Ð±ÑабаÑÑваемÑе даннÑе к ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи. ÐÑбÑе возникаÑÑие ÑÑÑÑкÑÑÑнÑе оÑибки подавлÑÑÑÑÑ Ð¸ заменÑÑÑÑÑ Ð¿ÑÑÑÑми поÑледоваÑелÑноÑÑÑми SQL/JSON.
strict â ÑÑÑогий Ñежим, в коÑоÑом ÑÑÑÑкÑÑÑнÑе оÑибки вÑдаÑÑÑÑ ÐºÐ°Ðº еÑÑÑ.
ÐеÑÑÑогий Ñежим ÑпÑоÑÐ°ÐµÑ ÑопоÑÑавление ÑÑÑÑкÑÑÑÑ Ð´Ð¾ÐºÑменÑа JSON Ñ Ð²ÑÑажением пÑÑи в ÑлÑÑаÑÑ , когда даннÑе JSON не ÑооÑвеÑÑÑвÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ð¹ ÑÑ ÐµÐ¼Ðµ. ÐÑли опеÑанд не ÑдовлеÑвоÑÑÐµÑ ÑÑебованиÑм опÑеделÑнной опеÑаÑии, он Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑед вÑполнением ÑÑой опеÑаÑии авÑомаÑиÑеÑки обоÑаÑиваÑÑÑÑ Ð² маÑÑив SQL/JSON или наобоÑоÑ, ÑазвоÑаÑиваÑÑÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐµÐ³Ð¾ ÑлеменÑÑ Ð¾Ð±Ñазовали поÑледоваÑелÑноÑÑÑ SQL/JSON. Ðомимо ÑÑого, в неÑÑÑогом Ñежиме опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑки ÑазвоÑаÑиваÑÑ Ñвои опеÑандÑ, ÑÑо позволÑÐµÑ Ð»ÐµÐ³ÐºÐ¾ ÑÑавниваÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ SQL/JSON. ÐаÑÑив Ñ Ð¾Ð´Ð½Ð¸Ð¼ ÑлеменÑом в Ñаком Ñежиме ÑÑиÑаеÑÑÑ ÑавнÑм ÑÐ²Ð¾ÐµÐ¼Ñ ÑлеменÑÑ. ÐвÑомаÑиÑеÑкое ÑазвоÑаÑивание не вÑполнÑеÑÑÑ ÑолÑко в ÑледÑÑÑÐ¸Ñ ÑлÑÑаÑÑ :
РвÑÑажении пÑÑи ÑигÑÑиÑÑÑÑ Ð¼ÐµÑодÑ
size()иtype(), возвÑаÑаÑÑие ÑооÑвеÑÑÑвенно ÑиÑло ÑлеменÑов в маÑÑиве и Ñип.ÐбÑабаÑÑваемÑе даннÑе JSON ÑодеÑÐ¶Ð°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе маÑÑивÑ. Ð ÑÑом ÑлÑÑае ÑазвоÑаÑиваеÑÑÑ ÑолÑко маÑÑив веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ, а внÑÑÑенние маÑÑÐ¸Ð²Ñ Ð¾ÑÑаÑÑÑÑ Ð±ÐµÐ· изменений. Таким обÑазом, неÑвное ÑазвоÑаÑивание Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑÑкаÑÑÑÑ Ð½Ð° каждом Ñаге вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи ÑолÑко на один ÑÑовенÑ.
ÐапÑимеÑ, обÑабаÑÑÐ²Ð°Ñ Ð´Ð°Ð½Ð½Ñе GPS, показаннÑе вÑÑе, в неÑÑÑогом Ñежиме можно не обÑаÑаÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ на Ñо, ÑÑо в Ð½Ð¸Ñ ÑодеÑжиÑÑÑ Ð¼Ð°ÑÑив ÑегменÑов:
'lax $.track.segments.location'
Ð ÑÑÑогом Ñежиме ÑказаннÑй пÑÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ в ÑоÑноÑÑи ÑооÑвеÑÑÑвоваÑÑ ÑÑÑÑкÑÑÑе обÑабаÑÑваемого докÑменÑа JSON и вÑдаваÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ SQL/JSON, поÑÑÐ¾Ð¼Ñ Ð¸ÑполÑзование Ñакого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи пÑиведÑÑ Ðº оÑибке. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ñакой же ÑезÑлÑÑаÑ, как в неÑÑÑогом Ñежиме, необÑ
одимо Ñвно ÑазвеÑнÑÑÑ Ð¼Ð°ÑÑив segments:
'strict $.track.segments[*].location'
ÐпеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ .** в неÑÑÑогом Ñежиме Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð½ÐµÑколÑко неожиданнÑе ÑезÑлÑÑаÑÑ. ÐапÑимеÑ, ÑледÑÑÑий запÑÐ¾Ñ Ð²ÑбеÑÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение HR дваждÑ:
lax $.**.HR
ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо опеÑаÑÐ¾Ñ .** вÑбиÑÐ°ÐµÑ Ð¸ маÑÑив segments, и каждÑй из его ÑлеменÑов, а обÑаÑение .HR в неÑÑÑогом Ñежиме авÑомаÑиÑеÑки ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑивÑ. Ðо избежание подобнÑÑ
ÑÑÑпÑизов Ð¼Ñ ÑекомендÑем иÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ .** ÑолÑко в ÑÑÑогом Ñежиме. СледÑÑÑий запÑÐ¾Ñ Ð²ÑбиÑÐ°ÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение HR в единÑÑвенном ÑкземплÑÑе:
strict $.**.HR
9.15.2.2. РегÑлÑÑнÑе вÑÑажениÑ
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей SQL/JSON могÑÑ ÑодеÑжаÑÑ ÑилÑÑÑÑ like_regex, позволÑÑÑие ÑопоÑÑавлÑÑÑ ÑекÑÑ Ñ ÑегÑлÑÑнÑм вÑÑажением. ÐапÑимеÑ, ÑледÑÑÑий запÑÐ¾Ñ Ð¿ÑÑи SQL/JSON вÑбеÑÐµÑ Ð²Ñе ÑÑÑоки в маÑÑиве, коÑоÑÑе наÑинаÑÑÑÑ Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñкой глаÑной в лÑбом ÑегиÑÑÑе:
'$[*] ? (@ like_regex "^[aeiou]" flag "i")'
ÐеобÑзаÑелÑÐ½Ð°Ñ ÑÑÑока flag Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко ÑледÑÑÑиÑ
Ñимволов: i, делаÑÑий поиÑк ÑегиÑÑÑонезавиÑимÑм, m, допÑÑкаÑÑий ÑопоÑÑавление ^ и $ Ñ Ð¿ÐµÑеводами ÑÑÑок, s, допÑÑкаÑÑий ÑопоÑÑавление . Ñ Ñимволом новой ÑÑÑоки, и q, беÑÑÑий в кавÑÑки веÑÑ Ñаблон (в ÑезÑлÑÑаÑе пÑоизводиÑÑÑ Ð¿ÑоÑÑой поиÑк подÑÑÑоки).
СÑандаÑÑ SQL/JSON заимÑÑвÑÐµÑ Ð¾Ð¿Ñеделение ÑегÑлÑÑнÑÑ
вÑÑажений Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑа LIKE_REGEX, коÑоÑÑй, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, ÑеализÑеÑÑÑ Ð¿Ð¾ ÑÑандаÑÑÑ XQuery. Ðднако в Postgres Pro опеÑаÑÐ¾Ñ LIKE_REGEX в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾ÑÑÑÑÑÑвÑеÑ. ÐоÑÑÐ¾Ð¼Ñ ÑилÑÑÑ like_regex Ñеализован Ñ Ð¸ÑполÑзованием меÑ
анизма ÑегÑлÑÑнÑÑ
вÑÑажений POSIX, коÑоÑÑй опиÑан в ÐодÑазделе 9.7.3. ÐÑледÑÑвие ÑÑого наблÑдаеÑÑÑ ÑÑд неболÑÑиÑ
оÑклонений Ð¾Ñ Ð¾Ð¿Ð¸Ñанного в ÑÑандаÑÑе Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ SQL/JSON, о коÑоÑÑÑ
ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе 9.7.3.8. ÐамеÑÑÑе однако, ÑÑо опиÑÐ°Ð½Ð½Ð°Ñ Ñам неÑовмеÑÑимоÑÑÑ Ð±Ñкв Ñлагов не пÑоÑвлÑеÑÑÑ Ð½Ð° ÑÑовне SQL/JSON, Ñак как заданнÑе в SQL/JSON Ñлаги XQuery пеÑеводÑÑÑÑ Ð²Ð¾ Ñлаги, воÑпÑинимаемÑе меÑ
анизмом POSIX.
ÐомниÑе, ÑÑо аÑгÑменÑ, задаÑÑий Ñаблон Ð´Ð»Ñ like_regex, ÑвлÑеÑÑÑ ÑÑÑокой пÑÑи JSON и запиÑÑваеÑÑÑ Ð¿Ð¾ пÑавилам, опиÑаннÑм в ÐодÑазделе 8.14.6. ÐÑо в ÑаÑÑноÑÑи ознаÑаеÑ, ÑÑо каждÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð² ÑегÑлÑÑном вÑÑажении надо дÑблиÑоваÑÑ. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð¾ÑобÑаÑÑ ÑÑÑоковÑе знаÑениÑ, наÑ
одÑÑиеÑÑ Ð½Ð° ÑÑовне коÑÐ½Ñ Ð´Ð¾ÐºÑменÑа и ÑодеÑжаÑие ÑолÑко ÑиÑÑÑ, нÑжно напиÑаÑÑ:
$.* ? (@ like_regex "^\\d+$")
9.15.2.3. ÐпеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ SQL/JSON
РТаблиÑе 9.48 пеÑеÑиÑÐ»ÐµÐ½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¸ меÑодÑ, коÑоÑÑе можно иÑполÑзоваÑÑ Ð² jsonpath. РТаблиÑе 9.49 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñе ÑлеменÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа.
ТаблиÑа 9.48. ÐпеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ jsonpath
| ÐпеÑаÑоÑ/ÐеÑод | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ JSON | ÐÑÐ¸Ð¼ÐµÑ Ð·Ð°Ð¿ÑоÑа | РезÑлÑÑÐ°Ñ |
|---|---|---|---|---|
+ (ÑнаÑнÑй) | ÐпеÑаÑÐ¾Ñ Â«Ð¿Ð»ÑÑ», пÑименÑемÑй к ÑлеменÑам поÑледоваÑелÑноÑÑи SQL/JSON | {"x": [2.85, -14.7, -9.4]} | + $.x.floor() | 2, -15, -10 |
- (ÑнаÑнÑй) | ÐпеÑаÑÐ¾Ñ Â«Ð¼Ð¸Ð½ÑÑ», пÑименÑемÑй к ÑлеменÑам поÑледоваÑелÑноÑÑи SQL/JSON | {"x": [2.85, -14.7, -9.4]} | - $.x.floor() | -2, 15, 10 |
+ (бинаÑнÑй) | Сложение | [2] | 2 + $[0] | 4 |
- (бинаÑнÑй) | ÐÑÑиÑание | [2] | 4 - $[0] | 2 |
* | Умножение | [4] | 2 * $[0] | 8 |
/ | Ðеление | [8] | $[0] / 2 | 4 |
% | ÐÑÑаÑок Ð¾Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ | [32] | $[0] % 10 | 2 |
type() | Тип ÑлеменÑа SQL/JSON | [1, "2", {}] | $[*].type() | "number", "string", "object" |
size() | Ð Ð°Ð·Ð¼ÐµÑ ÑлеменÑа SQL/JSON | {"m": [11, 15]} | $.m.size() | 2 |
double() | ÐÑиблизиÑелÑное ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, пÑеобÑазованное из ÑÑÑоки или ÑиÑла SQL/JSON | {"len": "1.9"} | $.len.double() * 2 | 3.8 |
ceiling() | ÐлижайÑее Ñелое, болÑÑее или Ñавное ÑиÑÐ»Ñ SQL/JSON | {"h": 1.3} | $.h.ceiling() | 2 |
floor() | ÐлижайÑее Ñелое, менÑÑее или Ñавное ÑиÑÐ»Ñ SQL/JSON | {"h": 1.3} | $.h.floor() | 1 |
abs() | ÐодÑÐ»Ñ ÑиÑла SQL/JSON (абÑолÑÑное знаÑение) | {"z": -0.3} | $.z.abs() | 0.3 |
keyvalue() | ÐоÑледоваÑелÑноÑÑÑ Ð¿Ð°Ñ ÐºÐ»ÑÑ-знаÑение, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð² виде маÑÑива ÑлеменÑов, ÑодеÑжаÑиÑ
ÑÑи Ð¿Ð¾Ð»Ñ ("key", "value" и "id"). Рполе id ÑодеÑжиÑÑÑ ÑникалÑнÑй иденÑиÑикаÑÐ¾Ñ Ð¾Ð±ÑекÑа, к коÑоÑÐ¾Ð¼Ñ Ð¾ÑноÑиÑÑÑ Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ñа клÑÑ-знаÑение. | {"x": "20", "y": 32} | $.keyvalue() | {"key": "x", "value": "20", "id": 0}, {"key": "y", "value": 32, "id": 0} |
ТаблиÑа 9.49. ÐлеменÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа jsonpath
| ÐнаÑение/ÐÑÐµÐ´Ð¸ÐºÐ°Ñ | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ JSON | ÐÑÐ¸Ð¼ÐµÑ Ð·Ð°Ð¿ÑоÑа | РезÑлÑÑÐ°Ñ |
|---|---|---|---|---|
== | ÐпеÑаÑÐ¾Ñ ÑавенÑÑва | [1, 2, 1, 3] | $[*] ? (@ == 1) | 1, 1 |
!= | ÐпеÑаÑÐ¾Ñ Ð½ÐµÑавенÑÑва | [1, 2, 1, 3] | $[*] ? (@ != 1) | 2, 3 |
<> | ÐпеÑаÑÐ¾Ñ Ð½ÐµÑавенÑÑва (Ñиноним !=) | [1, 2, 1, 3] | $[*] ? (@ <> 1) | 2, 3 |
< | ÐпеÑаÑÐ¾Ñ Â«Ð¼ÐµÐ½ÑÑе» | [1, 2, 3] | $[*] ? (@ < 2) | 1 |
<= | ÐпеÑаÑÐ¾Ñ Â«Ð¼ÐµÐ½ÑÑе или Ñавно» | [1, 2, 3] | $[*] ? (@ <= 2) | 1, 2 |
> | ÐпеÑаÑÐ¾Ñ Â«Ð±Ð¾Ð»ÑÑе» | [1, 2, 3] | $[*] ? (@ > 2) | 3 |
>= | ÐпеÑаÑÐ¾Ñ Â«Ð±Ð¾Ð»ÑÑе или Ñавно» | [1, 2, 3] | $[*] ? (@ >= 2) | 2, 3 |
true | ÐнаÑение, коÑоÑое можно ÑÑавниÑÑ Ñ Ð»Ð¾Ð³Ð¸ÑеÑким знаÑением JSON true | [{"name": "John", "parent": false}, {"name": "Chris", "parent": true}] | $[*] ? (@.parent == true) | {"name": "Chris", "parent": true} |
false | ÐнаÑение, коÑоÑое можно ÑÑавниÑÑ Ñ Ð»Ð¾Ð³Ð¸ÑеÑким знаÑением JSON false | [{"name": "John", "parent": false}, {"name": "Chris", "parent": true}] | $[*] ? (@.parent == false) | {"name": "John", "parent": false} |
null | ÐнаÑение, коÑоÑое можно ÑÑавниÑÑ Ñо знаÑением JSON null | [{"name": "Mary", "job": null}, {"name": "Michael", "job": "driver"}] | $[*] ? (@.job == null) .name | "Mary" |
&& | ÐогиÑеÑкое Ð | [1, 3, 7] | $[*] ? (@ > 1 && @ < 5) | 3 |
|| | ÐогиÑеÑкое ÐÐÐ | [1, 3, 7] | $[*] ? (@ < 1 || @ > 5) | 7 |
! | ÐогиÑеÑкое ÐÐ | [1, 3, 7] | $[*] ? (!(@ < 5)) | 7 |
like_regex | ÐÑовеÑÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ пеÑвÑй опеÑанд ÑегÑлÑÑÐ½Ð¾Ð¼Ñ Ð²ÑÑажениÑ, коÑоÑое задаÑÑ Ð²ÑоÑой опеÑанд Ñ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм аÑгÑменÑом flag, влиÑÑÑим на поведение вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ (Ñм. ÐодÑаздел 9.15.2.2) | ["abc", "abd", "aBdC", "abdacb", "babc"] | $[*] ? (@ like_regex "^ab.*c" flag "i") | "abc", "aBdC", "abdacb" |
starts with | ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ вÑоÑой опеÑанд наÑалÑной подÑÑÑокой пеÑвого | ["John Smith", "Mary Stone", "Bob Johnson"] | $[*] ? (@ starts with "John") | "John Smith" |
exists | ÐÑовеÑÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи минимÑм один ÑÐ»ÐµÐ¼ÐµÐ½Ñ SQL/JSON | {"x": [1, 2], "y": [2, 4]} | strict $.* ? (exists (@ ? (@[*] > 2))) | 2, 4 |
is unknown | ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ unknown ÑезÑлÑÑаÑом логиÑеÑкого ÑÑÐ»Ð¾Ð²Ð¸Ñ | [-1, 2, 7, "infinity"] | $[*] ? ((@ > 0) is unknown) | "infinity" |