9.16. ФÑнкÑии и опеÑаÑоÑÑ JSON
Ð ÑÑом Ñазделе опиÑÑваÑÑÑÑ:
ÑÑнкÑии и опеÑаÑоÑÑ, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð´Ð°Ð½Ð½Ñми JSON
ÑзÑк пÑÑей SQL/JSON
ЧÑÐ¾Ð±Ñ ÑзнаÑÑ Ð±Ð¾Ð»ÑÑе о ÑÑандаÑÑе SQL/JSON, обÑаÑиÑеÑÑ Ðº [sqltr-19075-6]. Ð¢Ð¸Ð¿Ñ JSON, поддеÑживаемÑе в Postgres Pro, опиÑÐ°Ð½Ñ Ð² Разделе 8.14.
9.16.1. ÐбÑабоÑка и Ñоздание даннÑÑ JSON
ÐÑимеÑание
ФÑнкÑии, ÑабоÑаÑÑие Ñ JSONB, не пÑинимаÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ '\u0000'. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¾Ñибок и заменÑÑÑ Ð¸Ñ
на леÑÑ, необÑ
одимо ÑказаÑÑ Ñимвол Unicode в паÑамеÑÑе конÑигÑÑаÑии unicode_nul_character_replacement_in_jsonb.
РТаблиÑе 9.44 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¸Ð¼ÐµÑÑиеÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð´Ð°Ð½Ð½Ñми JSON (Ñм. Раздел 8.14). ÐÑоме ниÑ
Ð´Ð»Ñ Ñипа jsonb, но не Ð´Ð»Ñ json, опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¾Ð±ÑÑнÑе опеÑаÑоÑÑ ÑÑавнениÑ, показаннÑе в ТаблиÑе 9.1. Ðни ÑледÑÑÑ Ð¿Ñавилам ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий B-деÑева, опиÑаннÑм в ÐодÑазделе 8.14.4. РРазделе 9.21 Ð²Ñ Ñакже можеÑе ÑзнаÑÑ Ð¾Ð± агÑегаÑной ÑÑнкÑии json_agg, коÑоÑÐ°Ñ Ð°Ð³ÑегиÑÑÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи в виде JSON, и агÑегаÑной ÑÑнкÑии json_object_agg, агÑегиÑÑÑÑей паÑÑ Ð·Ð½Ð°Ñений в обÑÐµÐºÑ JSON, а Ñакже иÑ
аналогаÑ
Ð´Ð»Ñ jsonb, ÑÑнкÑиÑÑ
jsonb_agg и jsonb_object_agg.
ТаблиÑа 9.44. ÐпеÑаÑоÑÑ Ð´Ð»Ñ Ñипов json и jsonb
ÐпеÑаÑÐ¾Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐзвлекаеÑ
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ JSON-обÑекÑа по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ.
|
ÐзвлекаеÑ
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ JSON-обÑекÑа по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ, в виде знаÑениÑ
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð²Ð½ÑÑÑенний JSON-обÑÐµÐºÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи, ÑлеменÑами коÑоÑого могÑÑ Ð±ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¼Ð°ÑÑивов или клÑÑи.
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð²Ð½ÑÑÑенний JSON-обÑÐµÐºÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи в виде знаÑениÑ
|
ÐÑимеÑание
ÐÑли ÑÑÑÑкÑÑÑа Ð²Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ JSON не ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ, напÑÐ¸Ð¼ÐµÑ ÑказаннÑй клÑÑ Ð¸Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива оÑÑÑÑÑÑвÑеÑ, опеÑаÑоÑÑ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ/ÑлеменÑа/пÑÑи не вÑдаÑÑ Ð¾ÑибкÑ, а возвÑаÑаÑÑ NULL.
ÐекоÑоÑÑе из ÑледÑÑÑиÑ
опеÑаÑоÑов ÑÑÑеÑÑвÑÑÑ ÑолÑко Ð´Ð»Ñ jsonb, как показано в ТаблиÑе 9.45. Ð ÐодÑазделе 8.14.4 опиÑано, как ÑÑи опеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑÑÑекÑивного поиÑка в индекÑиÑованнÑÑ
даннÑÑ
jsonb.
ТаблиÑа 9.45. ÐополниÑелÑнÑе опеÑаÑоÑÑ jsonb
ÐпеÑаÑÐ¾Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐеÑвое знаÑение JSON ÑодеÑÐ¶Ð¸Ñ Ð²ÑоÑое? (ЧÑо ознаÑÐ°ÐµÑ Â«ÑодеÑжиÑ», подÑобно опиÑÑваеÑÑÑ Ð² ÐодÑазделе 8.14.3.)
|
ÐеÑвое знаÑение JSON ÑодеÑжиÑÑÑ Ð²Ð¾ вÑоÑом?
|
ТекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока пÑиÑÑÑÑÑвÑÐµÑ Ð² знаÑении JSON в каÑеÑÑве клÑÑа веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑлеменÑа маÑÑива?
|
Ðакие-либо ÑекÑÑовÑе ÑÑÑоки из маÑÑива пÑиÑÑÑÑÑвÑÑÑ Ð² каÑеÑÑве клÑÑей веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑлеменÑов маÑÑива?
|
ÐÑе ÑекÑÑовÑе ÑÑÑоки из маÑÑива пÑиÑÑÑÑÑвÑÑÑ Ð² каÑеÑÑве клÑÑей веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑлеменÑов маÑÑива?
|
СоединÑÐµÑ Ð´Ð²Ð° знаÑениÑ
ЧÑÐ¾Ð±Ñ Ð²ÑÑавиÑÑ Ð¾Ð´Ð¸Ð½ маÑÑив в дÑÑгой в каÑеÑÑве маÑÑива, помеÑÑиÑе его в дополниÑелÑнÑй маÑÑив, напÑимеÑ:
|
УдалÑÐµÑ ÐºÐ»ÑÑ (и его знаÑение) из JSON-обÑекÑа или ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоковÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð· JSON-маÑÑива.
|
УдалÑÐµÑ Ð¸Ð· левого опеÑанда вÑе пеÑеÑиÑленнÑе клÑÑи или ÑлеменÑÑ Ð¼Ð°ÑÑива.
|
УдалÑÐµÑ Ð¸Ð· маÑÑива ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² заданной позиÑии (оÑÑиÑаÑелÑнÑе номеÑа позиÑий оÑÑÑиÑÑваÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа). ÐÑдаÑÑ Ð¾ÑибкÑ, еÑли пеÑеданное знаÑение JSON â не маÑÑив.
|
УдалÑÐµÑ Ð¿Ð¾Ð»Ðµ или ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм пÑÑÑм, в ÑоÑÑаве коÑоÑого могÑÑ Ð±ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¼Ð°ÑÑивов или клÑÑи.
|
ÐÑдаÑÑ Ð»Ð¸ пÑÑÑ JSON какой-либо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON?
|
ÐозвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑовеÑки пÑедикаÑа пÑÑи JSON Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. ÐÑи ÑÑом ÑÑиÑÑваеÑÑÑ ÑолÑко пеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑезÑлÑÑаÑа. ÐÑли ÑезÑлÑÑÐ°Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑким, возвÑаÑаеÑÑÑ
|
ÐÑимеÑание
ÐпеÑаÑоÑÑ jsonpath @? и @@ подавлÑÑÑ ÑледÑÑÑие оÑибки: оÑÑÑÑÑÑвие Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа или ÑлеменÑа маÑÑива, неÑовпадение Ñипа ÑлеменÑа JSON и оÑибки в ÑиÑлаÑ
и даÑе/вÑемени. ÐпиÑаннÑе ниже ÑÑнкÑии, ÑвÑзаннÑе Ñ jsonpath, Ñоже могÑÑ Ð¿Ð¾Ð´Ð°Ð²Ð»ÑÑÑ Ð¾Ñибки Ñакого Ñода. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, когда нÑжно пÑоизвеÑÑи поиÑк по набоÑÑ Ð´Ð¾ÐºÑменÑов JSON, имеÑÑиÑ
ÑазлиÑнÑÑ ÑÑÑÑкÑÑÑÑ.
РТаблиÑе 9.46 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð½Ð°Ñений json и jsonb.
ТаблиÑа 9.46. ФÑнкÑии Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ JSON
ФÑнкÑÐ¸Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐÑеобÑазÑÐµÑ Ð¿ÑоизволÑное SQL-знаÑение в
|
ÐÑеобÑазÑÐµÑ Ð¼Ð°ÑÑив SQL в JSON-маÑÑив. ÐÑа ÑÑнкÑÐ¸Ñ ÑабоÑÐ°ÐµÑ Ñак же, как
|
ÐÑеобÑазÑÐµÑ ÑоÑÑавное знаÑение SQL в JSON-обÑекÑ. ÐÑа ÑÑнкÑÐ¸Ñ ÑабоÑÐ°ÐµÑ Ñак же, как
|
ФоÑмиÑÑÐµÑ JSON-маÑÑив (возможно, ÑазноÑоднÑй) из пеÑеменного ÑпиÑка аÑгÑменÑов. ÐаждÑй аÑгÑÐ¼ÐµÐ½Ñ Ð¿ÑеобÑазÑеÑÑÑ Ð¼ÐµÑодом
|
ФоÑмиÑÑÐµÑ JSON-обÑÐµÐºÑ Ð¸Ð· пеÑеменного ÑпиÑка аÑгÑменÑов. Ðо ÑоглаÑÐµÐ½Ð¸Ñ Ð² ÑÑом ÑпиÑке пеÑеÑиÑлÑÑÑÑÑ Ð¿Ð¾ оÑеÑеди клÑÑи и знаÑениÑ. ÐÑгÑменÑÑ, задаÑÑие клÑÑи, пÑиводÑÑÑÑ Ðº ÑекÑÑÐ¾Ð²Ð¾Ð¼Ñ ÑипÑ, а аÑгÑменÑÑ-знаÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÑÑÑÑ Ð¼ÐµÑодом
|
ФоÑмиÑÑÐµÑ Ð¾Ð±ÑÐµÐºÑ JSON из ÑекÑÑового маÑÑива. ÐÑÐ¾Ñ Ð¼Ð°ÑÑив должен имеÑÑ Ð»Ð¸Ð±Ð¾ Ð¾Ð´Ð½Ñ ÑазмеÑноÑÑÑ Ñ ÑÑÑнÑм ÑиÑлом ÑлеменÑов (в ÑÑом ÑлÑÑае они воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº ÑеÑедÑÑÑиеÑÑ ÐºÐ»ÑÑи/знаÑениÑ), либо две ÑазмеÑноÑÑи и пÑи ÑÑом каждÑй внÑÑÑенний маÑÑив ÑодеÑÐ¶Ð¸Ñ Ñовно два ÑлеменÑа, коÑоÑÑе воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº паÑа клÑÑ/знаÑение. ÐÑе знаÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÑÑÑÑ Ð² ÑÑÑоки JSON.
|
ÐÑа ÑоÑма
|
[a] ÐапÑимеÑ, в ÑаÑÑиÑении hstore опÑеделено пÑеобÑазование из |
РТаблиÑе 9.47 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñо знаÑениÑми json и jsonb.
ТаблиÑа 9.47. ФÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки JSON
ФÑнкÑÐ¸Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-маÑÑив веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð² Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений JSON.
value ----------- 1 true [2,false] |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-маÑÑив веÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð² Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений
value ----------- foo bar |
ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑлеменÑов во внеÑнем JSON-маÑÑиве веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ.
|
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-обÑÐµÐºÑ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð² Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение (key/value).
key | value -----+------- a | "foo" b | "bar" |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-обÑÐµÐºÑ Ð²ÐµÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð² Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение (key/value). ÐозвÑаÑаемÑе знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¸Ð¼ÐµÑÑ Ñип
key | value -----+------- a | foo b | bar |
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð²Ð½ÑÑÑенний JSON-обÑÐµÐºÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи. (То же Ñамое Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑоÑ
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð²Ð½ÑÑÑенний JSON-обÑÐµÐºÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи в виде знаÑениÑ
|
ÐÑдаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво клÑÑей в JSON-обÑекÑе веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ.
json_object_keys ----------------- f1 f2 |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-обÑÐµÐºÑ Ð²ÐµÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð² ÑÑÑокÑ, имеÑÑÑÑ ÑоÑÑавной Ñип аÑгÑменÑа ÐÐ»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ JSON в SQL-Ñип вÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа поÑледоваÑелÑно пÑименÑÑÑÑÑ ÑледÑÑÑие пÑавила:
Ð ÑледÑÑÑем пÑимеÑе знаÑение JSON ÑикÑиÑовано, но обÑÑно ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑаÑаеÑÑÑ Ñ Ð¸ÑполÑзованием
a | b | c
---+-----------+-------------
1 | {2,"a b"} | (4,"a b c") |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-маÑÑив веÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ñ Ð¾Ð±ÑекÑами в Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, имеÑÑиÑ
ÑоÑÑавной Ñип аÑгÑменÑа
a | b ---+--- 1 | 2 3 | 4 |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-обÑÐµÐºÑ Ð²ÐµÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð² ÑÑÑокÑ, имеÑÑÑÑ ÑоÑÑавной Ñип, опÑеделÑннÑй в пÑедложении
a | b | c | d | r
---+---------+---------+---+---------------
1 | [1,2,3] | {1,2,3} | | (123,"a b c") |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ JSON-маÑÑив веÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ñ Ð¾Ð±ÑекÑами в Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, имеÑÑиÑ
ÑоÑÑавной Ñип, опÑеделÑннÑй в пÑедложении
a | b ---+----- 1 | foo 2 | |
ÐозвÑаÑÐ°ÐµÑ Ð¾Ð±ÑекÑ
|
ÐÑли знаÑение
|
ÐозвÑаÑÐ°ÐµÑ Ð¾Ð±ÑекÑ
|
УдалÑÐµÑ Ð¸Ð· данного знаÑÐµÐ½Ð¸Ñ JSON вÑе Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑов, имеÑÑие знаÑÐµÐ½Ð¸Ñ null, на вÑÐµÑ ÑÑовнÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи. ÐнаÑÐµÐ½Ð¸Ñ null, не оÑноÑÑÑиеÑÑ Ðº полÑм обÑекÑов, ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð±ÐµÐ· изменений.
|
ÐÑовеÑÑеÑ, еÑÑÑ Ð»Ð¸ в заданном знаÑении JSON какой-либо ÑлеменÑ, ÑооÑвеÑÑÑвÑÑÑий пÑÑи JSON. Ð ÑлÑÑае пÑиÑÑÑÑÑÐ²Ð¸Ñ Ð°ÑгÑменÑа
|
ÐозвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑовеÑки пÑедикаÑа пÑÑи JSON Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. ÐÑи ÑÑом ÑÑиÑÑваеÑÑÑ ÑолÑко пеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑезÑлÑÑаÑа. ÐÑли ÑезÑлÑÑÐ°Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑким, возвÑаÑаеÑÑÑ
|
ÐозвÑаÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ JSON, полÑÑеннÑе по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. ÐополниÑелÑнÑе аÑгÑменÑÑ
jsonb_path_query ------------------ 2 3 4 |
ÐозвÑаÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ JSON, полÑÑеннÑе по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON, в виде JSON-маÑÑива. ÐополниÑелÑнÑе аÑгÑменÑÑ
|
ÐозвÑаÑÐ°ÐµÑ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ JSON, полÑÑеннÑй по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON, либо NULL, еÑли ÑÑÐ¾Ð¼Ñ Ð¿ÑÑи не ÑооÑвеÑÑÑвÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ ÑлеменÑÑ. ÐополниÑелÑнÑе аÑгÑменÑÑ
|
ÐÑи ÑÑнкÑии ÑабоÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ иÑ
двойникам без ÑÑÑÑикÑа
|
ÐÑеобÑазÑÐµÑ Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение JSON в визÑалÑно ÑлÑÑÑенное ÑекÑÑовое пÑедÑÑавление Ñ Ð¾ÑÑÑÑпами.
[
{
"f1": 1,
"f2": null
},
2
] |
ÐозвÑаÑÐ°ÐµÑ Ñип знаÑÐµÐ½Ð¸Ñ Ð½Ð° веÑÑ
нем ÑÑовне JSON в виде ÑекÑÑовой ÑÑÑоки. ÐозможнÑе ÑипÑ:
|
9.16.2. ЯзÑк пÑÑей SQL/JSON
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей SQL/JSON опÑеделÑÑÑ ÑлеменÑÑ, извлекаемÑе из даннÑÑ
JSON, подобно ÑомÑ, как вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath позволÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð¸Ð· SQL к XML. Ð Postgres Pro вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей пÑедÑÑавлÑÑÑÑÑ Ð² виде Ñипа даннÑÑ
jsonpath и могÑÑ Ð¸ÑполÑзоваÑÑ Ð»ÑбÑе ÑлеменÑÑ, опиÑаннÑе в ÐодÑазделе 8.14.6.
ÐпеÑаÑоÑÑ Ð¸ ÑÑнкÑии запÑоÑов к JSON пеÑедаÑÑ Ð¿Ð¾ÑÑÑпивÑее им вÑÑажение обÑабоÑÑÐ¸ÐºÑ Ð¿ÑÑей Ð´Ð»Ñ Ð²ÑÑиÑлениÑ. ÐÑли вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑ ÑигÑÑиÑÑÑÑие в запÑоÑе даннÑе JSON, в ÑезÑлÑÑаÑе вÑдаÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ JSON или Ð½Ð°Ð±Ð¾Ñ ÑлеменÑов. ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей запиÑÑваÑÑÑÑ Ð½Ð° ÑзÑке пÑÑей SQL/JSON и могÑÑ Ð²ÐºÐ»ÑÑаÑÑ ÑложнÑе аÑиÑмеÑиÑеÑкие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ÑÑнкÑии.
ÐÑÑажение пÑÑи ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· поÑледоваÑелÑноÑÑи ÑлеменÑов, допÑÑÑимÑÑ
Ð´Ð»Ñ Ñипа jsonpath. ÐбÑÑно оно вÑÑиÑлÑеÑÑÑ Ñлева напÑаво, но пÑи необÑ
одимоÑÑи поÑÑдок опеÑаÑий можно измениÑÑ, добавив Ñкобки. Ð ÑлÑÑае ÑÑпеÑного вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑдаÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÑлеменÑов 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
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ ÑолÑко пеÑвого ÑегменÑа, можно задаÑÑ ÑооÑвеÑÑÑвÑÑÑий Ð¸Ð½Ð´ÐµÐºÑ Ð² опеÑаÑоÑе обÑаÑÐµÐ½Ð¸Ñ []. ÐамеÑÑÑе, ÑÑо индекÑÑ Ð² JSON-маÑÑиваÑ
оÑÑÑиÑÑваÑÑÑÑ Ñ 0:
$.track.segments[0].location
РезÑлÑÑÐ°Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñага вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑабоÑан опеÑаÑоÑами и меÑодами jsonpath, пеÑеÑиÑленнÑми в ÐодÑазделе 9.16.2.2. ÐеÑед именем меÑода должна ÑÑоÑÑÑ ÑоÑка. ÐапÑимеÑ, Ñак можно полÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива:
$.track.segments.size()
ÐÑÑгие пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов и меÑодов jsonpath в вÑÑажениÑÑ
пÑÑи пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ð¸Ð¶Ðµ в ÐодÑазделе 9.16.2.2.
ÐпÑеделÑÑ Ð¿ÑÑÑ, Ñакже можно иÑполÑзоваÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа, ÑабоÑаÑÑие подобно пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE в SQL. ÐÑÑажение ÑилÑÑÑа наÑинаеÑÑÑ Ñо знака вопÑоÑа и ÑодеÑÐ¶Ð¸Ñ ÑÑловие в ÑкобкаÑ
:
? (ÑÑловие)ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа ÑказÑваÑÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ñага вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи, к коÑоÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ. РезÑлÑÑаÑÑ Ñага пÑоÑ
одÑÑ ÑеÑез ÑилÑÑÑ, и на вÑÑ
оде оÑÑаÑÑÑÑ ÑолÑко Ñе ÑлеменÑÑ, коÑоÑÑе ÑдовлеÑвоÑÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑловиÑ. Ð SQL/JSON дейÑÑвÑÐµÑ ÑÑоиÑÐ½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ°, Ñо еÑÑÑ ÑезÑлÑÑаÑом вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ true, false или unknown (неизвеÑÑноÑÑÑ). ÐнаÑение unknown игÑÐ°ÐµÑ ÑÑ Ð¶Ðµ ÑолÑ, ÑÑо и NULL в SQL, и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑовеÑено пÑедикаÑом is unknown. Ðа поÑледÑÑÑиÑ
ÑагаÑ
вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÑолÑко Ñе ÑлеменÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
вÑÑажение ÑилÑÑÑа вÑдало true.
ФÑнкÑии и опеÑаÑоÑÑ, коÑоÑÑе можно иÑполÑзоваÑÑ Ð² вÑÑажениÑÑ
ÑилÑÑÑа, пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 9.49. ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ @ в вÑÑажении ÑилÑÑÑа пÑедÑÑавлÑÐµÑ ÑилÑÑÑÑемое знаÑение (ÑезÑлÑÑÐ°Ñ Ð¿ÑедÑдÑÑего Ñага в пÑÑи). ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²Ð½ÑÑÑенниÑ
ÑлеменÑов ÑÑого знаÑÐµÐ½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе добавиÑÑ Ð¿Ð¾Ñле @ опеÑаÑоÑÑ Ð¾Ð±ÑаÑениÑ.
ÐапÑимеÑ, пÑедположим, ÑÑо Ð²Ñ Ñ Ð¾ÑиÑе полÑÑиÑÑ Ð²Ñе показаÑели пÑлÑÑа, пÑевÑÑаÑÑие 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:
ÐÑÑажение пÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±ÑлевÑм пÑедикаÑом, Ñ Ð¾ÑÑ ÑÑандаÑÑ SQL/JSON допÑÑÐºÐ°ÐµÑ Ð¿ÑедикаÑÑ ÑолÑко в ÑилÑÑÑÐ°Ñ . ÐÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ ÑеализаÑии опеÑаÑоÑа
@@. ÐапÑимеÑ, ÑледÑÑÑее вÑÑажениеjsonpathдопÑÑкаеÑÑÑ Ð² Postgres Pro:$.track.segments[*].HR < 70
ÐÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие ÑазлиÑÐ¸Ñ Ð² инÑеÑпÑеÑаÑии Ñаблонов ÑегÑлÑÑнÑÑ Ð²ÑÑажений, иÑполÑзÑемÑÑ Ð² ÑилÑÑÑаÑ
like_regex; имеÑÑиеÑÑ Ð¾ÑобенноÑÑи опиÑÐ°Ð½Ñ Ð² ÐодÑазделе 9.16.2.3.
9.16.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.16.2.2. ÐпеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ SQL/JSON
РТаблиÑе 9.48 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¸ меÑодÑ, поддеÑживаемÑе в знаÑениÑÑ
jsonpath. ÐамеÑÑÑе, ÑÑо ÑнаÑнÑе опеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑименÑÑÑÑÑ Ðº множеÑÑÐ²Ñ Ð·Ð½Ð°Ñений, полÑÑеннÑÑ
на пÑедÑдÑÑем Ñаге пÑÑи, Ñогда как бинаÑнÑе опеÑаÑоÑÑ (Ñложение и Ñ. п.) пÑименÑÑÑÑÑ ÑолÑко к оÑделÑнÑм знаÑениÑм.
ТаблиÑа 9.48. ÐпеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ jsonpath
ÐпеÑаÑоÑ/ÐеÑод ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
Сложение
|
УнаÑнÑй плÑÑ (Ð½ÐµÑ Ð¾Ð¿ÐµÑаÑии); в оÑлиÑие Ð¾Ñ ÑложениÑ, он Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑеÑаÑионно пÑименÑÑÑÑÑ Ðº множеÑÑÐ²Ñ Ð·Ð½Ð°Ñений
|
ÐÑÑиÑание
|
Смена знака; в оÑлиÑие Ð¾Ñ Ð²ÑÑиÑаниÑ, ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑеÑаÑионно пÑименÑÑÑÑÑ Ðº множеÑÑÐ²Ñ Ð·Ð½Ð°Ñений
|
Умножение
|
Ðеление
|
ÐÑÑаÑок Ð¾Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ
|
Тип ÑлеменÑа JSON (Ñм.
|
Ð Ð°Ð·Ð¼ÐµÑ ÑлеменÑа JSON (ÑиÑло ÑлеменÑов в маÑÑиве либо 1, еÑли ÑÑо не маÑÑив)
|
ÐÑиблизиÑелÑное ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, пÑеобÑазованное из ÑÑÑоки или ÑиÑла JSON
|
ÐлижайÑее Ñелое, болÑÑее или Ñавное Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑиÑлÑ
|
ÐлижайÑее Ñелое, менÑÑее или Ñавное Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑиÑлÑ
|
ÐодÑÐ»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑиÑла (абÑолÑÑное знаÑение)
|
ÐнаÑение даÑÑ/вÑемени, полÑÑенное из ÑÑÑоки
|
ÐнаÑение даÑÑ/вÑемени, пÑеобÑазованное из ÑÑÑоки по ÑаблонÑ
|
ÐаÑÑ ÐºÐ»ÑÑ-знаÑение, пÑедÑÑавленнÑе в виде маÑÑива обÑекÑов Ñо ÑледÑÑÑими ÑÑÐµÐ¼Ñ Ð¿Ð¾Ð»Ñми:
|
ÐÑимеÑание
РезÑлÑÑиÑÑÑÑим Ñипом меÑодов datetime() и datetime( Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñаблон)date, timetz, time, timestamptz или timestamp. ÐÑи два меÑода опÑеделÑÑÑ Ñип Ñвоего ÑезÑлÑÑаÑа авÑомаÑиÑеÑки.
ÐеÑод datetime() пÑÑаеÑÑÑ Ð¿Ð¾ÑледоваÑелÑно ÑопоÑÑавиÑÑ Ð¿Ð¾ÑÑÑпивÑÑÑ Ð½Ð° вÑ
од ÑÑÑÐ¾ÐºÑ Ñ ISO-ÑоÑмаÑами Ñипов date, timetz, time, timestamptz и timestamp. ÐÑÑÑеÑив пеÑвÑй подÑ
одÑÑий ÑоÑмаÑ, он оÑÑанавливаеÑÑÑ Ð¸ возвÑаÑÐ°ÐµÑ ÑооÑвеÑÑÑвÑÑÑий Ñип даннÑÑ
.
ÐеÑод datetime( опÑеделÑÐµÑ ÑезÑлÑÑиÑÑÑÑий Ñип в ÑооÑвеÑÑÑвии Ñ Ð¿Ð¾Ð»Ñми заданного Ñаблона.Ñаблон)
ÐеÑÐ¾Ð´Ñ datetime() и datetime( пÑименÑÑÑ Ñе же пÑавила ÑазбоÑа ÑÑÑоки, ÑÑо и SQL-ÑÑнкÑÐ¸Ñ Ñаблон)to_timestamp (Ñм. Раздел 9.8), но Ñ ÑÑÐµÐ¼Ñ Ð¸ÑклÑÑениÑми. Ðо-пеÑвÑÑ
, ÑÑи меÑÐ¾Ð´Ñ Ð½Ðµ позволÑÑÑ Ð¸ÑполÑзоваÑÑ Ð² Ñаблоне полÑ, коÑоÑÑм не наÑ
одиÑÑÑ ÑооÑвеÑÑÑвие. Ðо-вÑоÑÑÑ
, в Ñаблоне допÑÑкаÑÑÑÑ ÑолÑко ÑледÑÑÑие ÑазделиÑели: знак минÑÑа, ÑоÑка, коÑÐ°Ñ ÑеÑÑа, запÑÑаÑ, апоÑÑÑоÑ, ÑоÑка Ñ Ð·Ð°Ð¿ÑÑой, запÑÑÐ°Ñ Ð¸ пÑобел. Ð-ÑÑеÑÑиÑ
, ÑазделиÑели в Ñаблоне Ð´Ð¾Ð»Ð¶Ð½Ñ Ð² ÑоÑноÑÑи ÑооÑвеÑÑÑвоваÑÑ Ð²Ñ
одной ÑÑÑоке.
ÐÑли ÑÑебÑеÑÑÑ ÑÑавниÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑазнÑÑ
Ñипов даÑÑ/вÑемени, пÑименÑеÑÑÑ Ð½ÐµÑвное пÑиведение Ñипа. ÐнаÑение date Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ñиведено к ÑÐ¸Ð¿Ñ timestamp или timestamptz; timestamp â к ÑÐ¸Ð¿Ñ timestamptz, а time â к timetz. Ðднако вÑе ÑÑи пÑиведениÑ, кÑоме пеÑвого, завиÑÑÑ Ð¾Ñ ÑекÑÑего знаÑÐµÐ½Ð¸Ñ TimeZone и поÑÑÐ¾Ð¼Ñ Ð½Ðµ могÑÑ Ð²ÑполнÑÑÑÑÑ Ð² ÑÑнкÑиÑÑ
jsonpath, не ÑÑиÑÑваÑÑиÑ
ÑаÑовой поÑÑ.
РТаблиÑе 9.49 пеÑеÑиÑÐ»ÐµÐ½Ñ Ð´Ð¾Ð¿ÑÑÑимÑе ÑлеменÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа.
ТаблиÑа 9.49. ÐлеменÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа jsonpath
ÐÑедикаÑ/знаÑение ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐÑовеÑка ÑавенÑÑва (вÑе опеÑаÑоÑÑ ÑÑавнениÑ, вклÑÑÐ°Ñ ÑÑоÑ, ÑабоÑаÑÑ Ñ Ð»ÑбÑми ÑкалÑÑнÑми знаÑениÑми JSON)
|
ÐÑовеÑка неÑавенÑÑва
|
ÐÑовеÑка «менÑÑе»
|
ÐÑовеÑка «менÑÑе или Ñавно»
|
ÐÑовеÑка «болÑÑе»
|
ÐÑовеÑка «болÑÑе или Ñавно»
|
JSON-конÑÑанÑа
|
JSON-конÑÑанÑа
|
JSON-конÑÑанÑа
|
ÐогиÑеÑкое Ð
|
ÐогиÑеÑкое ÐÐÐ
|
ÐогиÑеÑкое ÐÐ
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸
|
ÐÑовеÑÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ пеÑвÑй опеÑанд ÑегÑлÑÑÐ½Ð¾Ð¼Ñ Ð²ÑÑажениÑ, коÑоÑое задаÑÑ Ð²ÑоÑой опеÑанд Ñ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм аÑгÑменÑом
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ вÑоÑой опеÑанд наÑалÑной подÑÑÑокой пеÑвого.
|
ÐÑовеÑÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи минимÑм один ÑÐ»ÐµÐ¼ÐµÐ½Ñ SQL/JSON. ÐозвÑаÑаеÑ
|
9.16.2.3. РегÑлÑÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ SQL/JSON
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей 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+$")