9.16. ФÑнкÑии и опеÑаÑоÑÑ JSON #
Ð ÑÑом Ñазделе опиÑÑваÑÑÑÑ:
ÑÑнкÑии и опеÑаÑоÑÑ, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð´Ð°Ð½Ð½Ñми JSON
ÑзÑк пÑÑей SQL/JSON
ÑÑнкÑии запÑоÑов SQL/JSON
Postgres Pro ÑеализÑÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð´Ð°Ð½Ð½ÑÑ SQL/JSON, обеÑпеÑÐ¸Ð²Ð°Ñ Ð²ÑÑÑоеннÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ñипов даннÑÑ JSON в ÑÑеде SQL. Ð ÑÑой модели даннÑе пÑедÑÑавлÑÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми ÑлеменÑов. ÐаждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑкалÑÑнÑе знаÑÐµÐ½Ð¸Ñ SQL, дополниÑелÑно опÑеделÑнное в SQL/JSON знаÑение null и ÑоÑÑавнÑе ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , обÑазÑемÑе обÑекÑами и маÑÑивами JSON. ÐÐ°Ð½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð¿Ð¾ ÑÑÑи ÑоÑмализÑÐµÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð´Ð°Ð½Ð½ÑÑ , опиÑаннÑÑ Ð² ÑпеÑиÑикаÑии JSON RFC 7159.
ÐоддеÑжка SQL/JSON позволÑÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð´Ð°Ð½Ð½Ñе JSON наÑÑÐ´Ñ Ñ Ð¾Ð±ÑÑнÑми даннÑми SQL, иÑполÑзÑÑ Ð¿Ñи ÑÑом ÑÑанзакÑии, напÑимеÑ:
ÐагÑÑжаÑÑ Ð´Ð°Ð½Ð½Ñе JSON в Ð±Ð°Ð·Ñ Ð¸ ÑÐ¾Ñ ÑанÑÑÑ Ð¸Ñ Ð² обÑÑнÑÑ ÑÑолбÑÐ°Ñ SQL в виде ÑимволÑнÑÑ Ð¸Ð»Ð¸ двоиÑнÑÑ ÑÑÑок.
СоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð¸ маÑÑÐ¸Ð²Ñ JSON из ÑелÑÑионнÑÑ Ð´Ð°Ð½Ð½ÑÑ .
ÐбÑаÑаÑÑÑÑ Ðº даннÑм JSON, иÑполÑзÑÑ ÑÑнкÑии запÑоÑов SQL/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.47 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¸Ð¼ÐµÑÑиеÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð´Ð°Ð½Ð½Ñми 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.47. ÐпеÑаÑоÑÑ Ð´Ð»Ñ Ñипов json и jsonb
ÐпеÑаÑÐ¾Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐзвлекаеÑ
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ JSON-обÑекÑа по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ.
|
ÐзвлекаеÑ
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ JSON-обÑекÑа по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ, в виде знаÑениÑ
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð²Ð½ÑÑÑенний JSON-обÑÐµÐºÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи, ÑлеменÑами коÑоÑого могÑÑ Ð±ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¼Ð°ÑÑивов или клÑÑи.
|
ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð²Ð½ÑÑÑенний JSON-обÑÐµÐºÑ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи в виде знаÑениÑ
|
ÐÑимеÑание
ÐÑли ÑÑÑÑкÑÑÑа Ð²Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ JSON не ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ, напÑÐ¸Ð¼ÐµÑ ÑказаннÑй клÑÑ Ð¸Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива оÑÑÑÑÑÑвÑеÑ, опеÑаÑоÑÑ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ/ÑлеменÑа/пÑÑи не вÑдаÑÑ Ð¾ÑибкÑ, а возвÑаÑаÑÑ NULL.
ÐекоÑоÑÑе из ÑледÑÑÑиÑ
опеÑаÑоÑов ÑÑÑеÑÑвÑÑÑ ÑолÑко Ð´Ð»Ñ jsonb, как показано в ТаблиÑе 9.48. Ð ÐодÑазделе 8.14.4 опиÑано, как ÑÑи опеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑÑÑекÑивного поиÑка в индекÑиÑованнÑÑ
даннÑÑ
jsonb.
ТаблиÑа 9.48. ÐополниÑелÑнÑе опеÑаÑоÑÑ jsonb
ÐпеÑаÑÐ¾Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐеÑвое знаÑение JSON ÑодеÑÐ¶Ð¸Ñ Ð²ÑоÑое? (ЧÑо ознаÑÐ°ÐµÑ Â«ÑодеÑжиÑ», подÑобно опиÑÑваеÑÑÑ Ð² ÐодÑазделе 8.14.3.)
|
ÐеÑвое знаÑение JSON ÑодеÑжиÑÑÑ Ð²Ð¾ вÑоÑом?
|
ТекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока пÑиÑÑÑÑÑвÑÐµÑ Ð² знаÑении JSON в каÑеÑÑве клÑÑа веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑлеменÑа маÑÑива?
|
Ðакие-либо ÑекÑÑовÑе ÑÑÑоки из маÑÑива пÑиÑÑÑÑÑвÑÑÑ Ð² каÑеÑÑве клÑÑей веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑлеменÑов маÑÑива?
|
ÐÑе ÑекÑÑовÑе ÑÑÑоки из маÑÑива пÑиÑÑÑÑÑвÑÑÑ Ð² каÑеÑÑве клÑÑей веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑлеменÑов маÑÑива?
|
СоединÑÐµÑ Ð´Ð²Ð° знаÑениÑ
ЧÑÐ¾Ð±Ñ Ð²ÑÑавиÑÑ Ð¾Ð´Ð¸Ð½ маÑÑив в дÑÑгой в каÑеÑÑве маÑÑива, помеÑÑиÑе его в дополниÑелÑнÑй маÑÑив, напÑимеÑ:
|
УдалÑÐµÑ ÐºÐ»ÑÑ (и его знаÑение) из JSON-обÑекÑа или ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоковÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð· JSON-маÑÑива.
|
УдалÑÐµÑ Ð¸Ð· левого опеÑанда вÑе пеÑеÑиÑленнÑе клÑÑи или ÑлеменÑÑ Ð¼Ð°ÑÑива.
|
УдалÑÐµÑ Ð¸Ð· маÑÑива ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² заданной позиÑии (оÑÑиÑаÑелÑнÑе номеÑа позиÑий оÑÑÑиÑÑваÑÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа). ÐÑдаÑÑ Ð¾ÑибкÑ, еÑли пеÑеданное знаÑение JSON â не маÑÑив.
|
УдалÑÐµÑ Ð¿Ð¾Ð»Ðµ или ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм пÑÑÑм, в ÑоÑÑаве коÑоÑого могÑÑ Ð±ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¼Ð°ÑÑивов или клÑÑи.
|
ÐозвÑаÑÐ°ÐµÑ Ð»Ð¸ пÑÑÑ JSON какой-либо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ñказанного знаÑÐµÐ½Ð¸Ñ JSON? (ÐÑо полезно ÑолÑко Ð´Ð»Ñ Ð²ÑÑажений пÑÑи JSON по ÑÑандаÑÑÑ SQL, но не Ð´Ð»Ñ Ð²ÑÑажений пÑовеÑки пÑедикаÑов, поÑколÑÐºÑ Ð¾Ð½Ð¸ вÑегда возвÑаÑаÑÑ Ð·Ð½Ð°Ñение.)
|
ÐозвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑовеÑки пÑедикаÑа пÑÑи JSON Ð´Ð»Ñ Ñказанного знаÑÐµÐ½Ð¸Ñ JSON. (ÐÑо полезно ÑолÑко Ð´Ð»Ñ Ð²ÑÑажений пÑовеÑки пÑедикаÑов, но не Ð´Ð»Ñ Ð²ÑÑажений пÑÑи JSON по ÑÑандаÑÑÑ SQL, поÑколÑÐºÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ
|
ÐÑимеÑание
ÐпеÑаÑоÑÑ jsonpath @? и @@ подавлÑÑÑ ÑледÑÑÑие оÑибки: оÑÑÑÑÑÑвие Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа или ÑлеменÑа маÑÑива, неÑовпадение Ñипа ÑлеменÑа JSON и оÑибки в ÑиÑлаÑ
и даÑе/вÑемени. ÐпиÑаннÑе ниже ÑÑнкÑии, ÑвÑзаннÑе Ñ jsonpath, Ñоже могÑÑ Ð¿Ð¾Ð´Ð°Ð²Ð»ÑÑÑ Ð¾Ñибки Ñакого Ñода. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, когда нÑжно пÑоизвеÑÑи поиÑк по набоÑÑ Ð´Ð¾ÐºÑменÑов JSON, имеÑÑиÑ
ÑазлиÑнÑÑ ÑÑÑÑкÑÑÑÑ.
РТаблиÑе 9.49 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, позволÑÑÑие ÑоздаваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñипов json и jsonb. ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
ÑÑнкÑий в ÑÑой ÑаблиÑе имееÑÑÑ Ð¿Ñедложение RETURNING, коÑоÑое опÑеделÑÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй Ñип даннÑÑ
. ÐÑо должен бÑÑÑ json, jsonb, bytea, Ñип ÑимволÑной ÑÑÑоки (text, char или varchar) или Ñип, коÑоÑÑй можно пÑивеÑÑи к json. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ñип json.
ТаблиÑа 9.49. ФÑнкÑии Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ JSON
ФÑнкÑÐ¸Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐÑеобÑазÑÐµÑ Ð¿ÑоизволÑное SQL-знаÑение в
|
ÐÑеобÑазÑÐµÑ Ð¼Ð°ÑÑив SQL в JSON-маÑÑив. ÐÑа ÑÑнкÑÐ¸Ñ ÑабоÑÐ°ÐµÑ Ñак же, как
|
СоздаÑÑ Ð¼Ð°ÑÑив JSON либо из набоÑа паÑамеÑÑов
|
ÐÑеобÑазÑÐµÑ ÑоÑÑавное знаÑение SQL в JSON-обÑекÑ. ÐÑа ÑÑнкÑÐ¸Ñ ÑабоÑÐ°ÐµÑ Ñак же, как
|
ФоÑмиÑÑÐµÑ JSON-маÑÑив (возможно, ÑазноÑоднÑй) из пеÑеменного ÑпиÑка аÑгÑменÑов. ÐаждÑй аÑгÑÐ¼ÐµÐ½Ñ Ð¿ÑеобÑазÑеÑÑÑ Ð¼ÐµÑодом
|
ФоÑмиÑÑÐµÑ JSON-обÑÐµÐºÑ Ð¸Ð· пеÑеменного ÑпиÑка аÑгÑменÑов. Ðо ÑоглаÑÐµÐ½Ð¸Ñ Ð² ÑÑом ÑпиÑке пеÑеÑиÑлÑÑÑÑÑ Ð¿Ð¾ оÑеÑеди клÑÑи и знаÑениÑ. ÐÑгÑменÑÑ, задаÑÑие клÑÑи, пÑиводÑÑÑÑ Ðº ÑекÑÑÐ¾Ð²Ð¾Ð¼Ñ ÑипÑ, а аÑгÑменÑÑ-знаÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÑÑÑÑ Ð¼ÐµÑодом
|
СоздаÑÑ Ð¾Ð±ÑÐµÐºÑ JSON из вÑеÑ
заданнÑÑ
Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение или пÑÑÑой обÑекÑ, еÑли ни одна паÑа не задана. РаÑгÑменÑе
|
ФоÑмиÑÑÐµÑ Ð¾Ð±ÑÐµÐºÑ JSON из ÑекÑÑового маÑÑива. ÐÑÐ¾Ñ Ð¼Ð°ÑÑив должен имеÑÑ Ð»Ð¸Ð±Ð¾ Ð¾Ð´Ð½Ñ ÑазмеÑноÑÑÑ Ñ ÑÑÑнÑм ÑиÑлом ÑлеменÑов (в ÑÑом ÑлÑÑае они воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº ÑеÑедÑÑÑиеÑÑ ÐºÐ»ÑÑи/знаÑениÑ), либо две ÑазмеÑноÑÑи и пÑи ÑÑом каждÑй внÑÑÑенний маÑÑив ÑодеÑÐ¶Ð¸Ñ Ñовно два ÑлеменÑа, коÑоÑÑе воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº паÑа клÑÑ/знаÑение. ÐÑе знаÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÑÑÑÑ Ð² ÑÑÑоки JSON.
|
ÐÑа ÑоÑма
|
ÐÑеобÑазÑÐµÑ Ð²ÑÑажение, заданное в виде ÑÑÑоки Ñипа
|
ÐÑеобÑазÑÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ ÑкалÑÑное знаÑение SQL в ÑкалÑÑное знаÑение JSON. ÐÑли пеÑедаÑÑÑÑ NULL, возвÑаÑаеÑÑÑ SQL NULL. ÐÑли пеÑедаÑÑÑÑ ÑиÑло или логиÑеÑкое знаÑение, возвÑаÑаеÑÑÑ ÑооÑвеÑÑÑвÑÑÑее ÑиÑловое или логиÑеÑкое знаÑение JSON. ÐÐ»Ñ Ð»Ñбого дÑÑгого знаÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ ÑÑÑока JSON.
|
ÐÑеобÑазÑÐµÑ Ð²ÑÑажение SQL/JSON в ÑимволÑнÑÑ Ð¸Ð»Ð¸ двоиÑнÑÑ ÑÑÑокÑ. ÐÑгÑменÑ
|
[a] ÐапÑимеÑ, в ÑаÑÑиÑении hstore опÑеделено пÑеобÑазование из |
РТаблиÑе 9.50 опиÑÐ°Ð½Ñ ÑÑедÑÑва SQL/JSON Ð´Ð»Ñ Ð¿ÑовеÑки JSON.
ТаблиÑа 9.50. ФÑнкÑии пÑовеÑки SQL/JSON
РТаблиÑе 9.51 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñо знаÑениÑми json и jsonb.
ТаблиÑа 9.51. ФÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки 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") |
ФÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑеÑÑиÑованиÑ
jsonb_populate_record_valid ----------------------------- f (1 row)
ÐШÐÐÐÐ: знаÑение не ÑмеÑаеÑÑÑ Ð² Ñип character(2)
jsonb_populate_record_valid ----------------------------- t (1 row)
a ---- aa (1 row) |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ 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, на вÑеÑ
ÑÑовнÑÑ
вложенноÑÑи. ÐÑли длÑ
|
ÐпÑеделÑеÑ, вÑдаÑÑ Ð»Ð¸ пÑÑÑ JSON какой-либо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ñи заданном знаÑении JSON. (ÐÑо полезно ÑолÑко Ð´Ð»Ñ Ð²ÑÑажений пÑÑи JSON по ÑÑандаÑÑÑ SQL, а не Ð´Ð»Ñ Ð²ÑÑажений пÑовеÑки пÑедикаÑов, поÑколÑÐºÑ Ð¾Ð½Ð¸ вÑегда возвÑаÑаÑÑ Ð·Ð½Ð°Ñение.) Ð ÑлÑÑае пÑиÑÑÑÑÑÐ²Ð¸Ñ Ð°ÑгÑменÑа
|
ÐозвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ SQL Ñипа
|
ÐозвÑаÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ JSON, полÑÑеннÑе по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи JSON Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON. ÐÐ»Ñ Ð²ÑÑажений пÑÑи JSON по ÑÑандаÑÑÑ SQL возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ JSON, вÑбÑаннÑе из
jsonb_path_query ------------------ 2 3 4 |
ÐозвÑаÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ JSON, полÑÑеннÑе по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON, в виде JSON-маÑÑива. ÐаÑамеÑÑÑ Ñ ÑÑой ÑÑнкÑии Ñе же, ÑÑо и Ñ
|
ÐозвÑаÑÐ°ÐµÑ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ JSON, полÑÑеннÑй по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ JSON, либо
|
ÐÑи ÑÑнкÑии ÑабоÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ иÑ
двойникам без ÑÑÑÑикÑа
|
ÐÑеобÑазÑÐµÑ Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение JSON в визÑалÑно ÑлÑÑÑенное ÑекÑÑовое пÑедÑÑавление Ñ Ð¾ÑÑÑÑпами.
[
{
"f1": 1,
"f2": null
},
2
] |
ÐозвÑаÑÐ°ÐµÑ Ñип знаÑÐµÐ½Ð¸Ñ Ð½Ð° веÑÑ
нем ÑÑовне JSON в виде ÑекÑÑовой ÑÑÑоки. ÐозможнÑе ÑипÑ:
|
9.16.2. ЯзÑк пÑÑей SQL/JSON #
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей SQL/JSON опÑеделÑÑÑ ÑлеменÑÑ, извлекаемÑе из даннÑÑ
JSON, подобно ÑомÑ, как вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ XPath позволÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð¸Ð· SQL к XML. Ð Postgres Pro вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей пÑедÑÑавлÑÑÑÑÑ Ð² виде Ñипа даннÑÑ
jsonpath и могÑÑ Ð¸ÑполÑзоваÑÑ Ð»ÑбÑе ÑлеменÑÑ, опиÑаннÑе в ÐодÑазделе 8.14.7.
ÐпеÑаÑоÑÑ Ð¸ ÑÑнкÑии запÑоÑов к JSON пеÑедаÑÑ Ð¿Ð¾ÑÑÑпивÑее им вÑÑажение обÑабоÑÑÐ¸ÐºÑ Ð¿ÑÑей Ð´Ð»Ñ Ð²ÑÑиÑлениÑ. ÐÑли вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑ ÑигÑÑиÑÑÑÑие в запÑоÑе даннÑе JSON, в ÑезÑлÑÑаÑе вÑдаÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ JSON или Ð½Ð°Ð±Ð¾Ñ ÑлеменÑов. ÐÑли Ñовпадение не найдено, в завиÑимоÑÑи Ð¾Ñ ÑÑнкÑии вÑдаÑÑÑÑ NULL, false или оÑибка. ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑей запиÑÑваÑÑÑÑ Ð½Ð° ÑзÑке пÑÑей SQL/JSON и могÑÑ Ð²ÐºÐ»ÑÑаÑÑ ÑложнÑе аÑиÑмеÑиÑеÑкие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ÑÑнкÑии.
ÐÑÑажение пÑÑи ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· поÑледоваÑелÑноÑÑи ÑлеменÑов, допÑÑÑимÑÑ
Ð´Ð»Ñ Ñипа jsonpath. ÐбÑÑно оно вÑÑиÑлÑеÑÑÑ Ñлева напÑаво, но пÑи необÑ
одимоÑÑи поÑÑдок опеÑаÑий можно измениÑÑ, добавив Ñкобки. Ð ÑлÑÑае ÑÑпеÑного вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑдаÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÑлеменÑов JSON, и ÑезÑлÑÑÐ°Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð² ÑÑнкÑÐ¸Ñ JSON-запÑоÑа, коÑоÑÐ°Ñ Ð·Ð°Ð²ÐµÑÑÐ°ÐµÑ Ð¾Ð±ÑабоÑÐºÑ Ð²ÑÑажениÑ.
ÐÐ»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº поÑÑÑпивÑÐµÐ¼Ñ Ð² запÑÐ¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ JSON (ÑлеменÑÑ ÐºÐ¾Ð½ÑекÑÑа) в вÑÑажении пÑÑи иÑполÑзÑеÑÑÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ $. ÐеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÑÑи вÑегда должен бÑÑÑ $. ÐаÑем могÑÑ ÑледоваÑÑ Ð¾Ð´Ð¸Ð½ или более опеÑаÑоÑов обÑаÑениÑ, коÑоÑÑе, опÑÑкаÑÑÑ Ð² ÑÑÑÑкÑÑÑе JSON Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð½Ð° дÑÑгой, извлекаÑÑ ÑлеменÑÑ, вложеннÑе в ÑекÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ¾Ð½ÑекÑÑа. ÐÑи ÑÑом каждÑй опеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ Ð´ÐµÐ»Ð¾ Ñ ÑезÑлÑÑаÑом вÑÑиÑлениÑ, полÑÑеннÑм на пÑедÑдÑÑем Ñаге, и вÑдаÑÑ Ð½Ð¾Ð»Ñ, один или более вÑÑ
однÑÑ
ÑлеменÑов на каждÑй вÑ
одной ÑлеменÑ.
ÐопÑÑÑим, нÑжно пÑоанализиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе JSON Ñ GPS-ÑÑекеÑа, напÑимеÑ:
SELECT '{
"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
}
]
}
}' AS json \gset (ÐÑÐ¸Ð¼ÐµÑ Ð²ÑÑе можно ÑкопиÑоваÑÑ Ð¸ вÑÑавиÑÑ Ð² psql, ÑÑÐ¾Ð±Ñ Ð½Ð°ÑÑÑоиÑÑ Ð²ÑÑ Ð´Ð»Ñ ÑледÑÑÑиÑ
пÑимеÑов. ÐаÑем psql ÑаÑÑиÑÐ¸Ñ :'json' до ÑÑÑоковой конÑÑанÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑиÑ
кавÑÑкаÑ
, ÑодеÑжаÑей знаÑение JSON.)
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑпнÑе ÑегменÑÑ Ð¾ÑÑлеживаниÑ, иÑполÑзÑйÑе опеÑаÑÐ¾Ñ Ð´Ð¾ÑÑÑпа . Ð´Ð»Ñ ÑпÑÑка по окÑÑжаÑÑим обÑекÑам JSON, напÑимеÑ: клÑÑ
=>select jsonb_path_query(:'json', '$.track.segments');jsonb_path_query -----------------------------------------------------------â------------------------------------------------------------â-------------------------------------------- [{"HR": 73, "location": [47.763, 13.4034], "start time": "2018-10-14 10:05:14"}, {"HR": 135, "location": [47.706, 13.2635], "start time": "2018-10-14 10:39:21"}]
ÐÐ»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ ÑодеÑжимого маÑÑива обÑÑно иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ [*]. Ð ÑледÑÑÑем пÑимеÑе возвÑаÑаÑÑÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ Ð¼ÐµÑÑÐ¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑеÑ
доÑÑÑпнÑÑ
ÑегменÑов ÑÑеков:
=>select jsonb_path_query(:'json', '$.track.segments[*].location');jsonb_path_query ------------------- [47.763, 13.4034] [47.706, 13.2635]
ÐдеÑÑ Ð¼Ñ Ð½Ð°Ñали Ñ Ñелого вÑ
одного знаÑÐµÐ½Ð¸Ñ JSON ($), заÑем опеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ .track вÑбÑал обÑÐµÐºÑ JSON, ÑвÑзаннÑй Ñ ÐºÐ»ÑÑом обÑекÑа "track", опеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ .segments вÑбÑал маÑÑив JSON, ÑвÑзаннÑй Ñ ÐºÐ»ÑÑом "segments" внÑÑÑи ÑÑого обÑекÑа, опеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ [*] вÑбÑал каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑÑого маÑÑива (Ñоздав ÑÑд ÑлеменÑов), а опеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ .location вÑбÑал маÑÑив JSON, ÑвÑзаннÑй Ñ ÐºÐ»ÑÑом "location" внÑÑÑи каждого из ÑÑиÑ
обÑекÑов. Ð ÑÑом пÑимеÑе Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из ÑÑиÑ
обÑекÑов бÑл клÑÑ "location", но еÑли Ð±Ñ ÑÑо бÑло не Ñак, вÑвод опеÑаÑоÑа обÑаÑÐµÐ½Ð¸Ñ .location бÑл Ð±Ñ Ð¿ÑÑÑÑм Ð´Ð»Ñ ÑÑого ÑлеменÑа ввода.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ ÑолÑко пеÑвого ÑегменÑа, можно задаÑÑ ÑооÑвеÑÑÑвÑÑÑий Ð¸Ð½Ð´ÐµÐºÑ Ð² опеÑаÑоÑе обÑаÑÐµÐ½Ð¸Ñ []. ÐбÑаÑиÑе внимание, ÑÑо индекÑÑ Ð² JSON-маÑÑиваÑ
оÑÑÑиÑÑваÑÑÑÑ Ñ 0:
=>select jsonb_path_query(:'json', '$.track.segments[0].location');jsonb_path_query ------------------- [47.763, 13.4034]
РезÑлÑÑÐ°Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñага вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑабоÑан одним или неÑколÑкими опеÑаÑоÑами и меÑодами jsonpath, пеÑеÑиÑленнÑми в ÐодÑазделе 9.16.2.3. ÐеÑед именем меÑода должна ÑÑоÑÑÑ ÑоÑка. ÐапÑимеÑ, Ñак можно полÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива:
=>select jsonb_path_query(:'json', '$.track.segments.size()');jsonb_path_query ------------------ 2
ÐÑÑгие пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов и меÑодов jsonpath в вÑÑажениÑÑ
пÑÑи пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ð¸Ð¶Ðµ в ÐодÑазделе 9.16.2.3.
ÐпÑеделÑÑ Ð¿ÑÑÑ, Ñакже можно иÑполÑзоваÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа, ÑабоÑаÑÑие подобно пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE в SQL. ÐÑÑажение ÑилÑÑÑа наÑинаеÑÑÑ Ñо знака вопÑоÑа и ÑодеÑÐ¶Ð¸Ñ ÑÑловие в кÑÑглÑÑ
ÑкобкаÑ
:
? (ÑÑловие)
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа ÑказÑваÑÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ñага вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи, к коÑоÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ. РезÑлÑÑаÑÑ Ñага пÑоÑ
одÑÑ ÑеÑез ÑилÑÑÑ, и на вÑÑ
оде оÑÑаÑÑÑÑ ÑолÑко Ñе ÑлеменÑÑ, коÑоÑÑе ÑдовлеÑвоÑÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑловиÑ. Ð SQL/JSON дейÑÑвÑÐµÑ ÑÑоиÑÐ½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ°, Ñо еÑÑÑ ÑезÑлÑÑаÑом пÑовеÑки ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ true, false или unknown (неизвеÑÑноÑÑÑ). ÐнаÑение unknown игÑÐ°ÐµÑ ÑÑ Ð¶Ðµ ÑолÑ, ÑÑо и NULL в SQL, и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑовеÑено пÑедикаÑом is unknown. Ðа поÑледÑÑÑиÑ
ÑагаÑ
вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÑолÑко Ñе ÑлеменÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
вÑÑажение ÑилÑÑÑа вÑдало true.
ФÑнкÑии и опеÑаÑоÑÑ, коÑоÑÑе можно иÑполÑзоваÑÑ Ð² вÑÑажениÑÑ
ÑилÑÑÑа, пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 9.53. ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ @ в вÑÑажении ÑилÑÑÑа пÑедÑÑавлÑÐµÑ ÑаÑÑмаÑÑиваемое знаÑение (ÑезÑлÑÑÐ°Ñ Ð¿ÑедÑдÑÑего Ñага в пÑÑи). ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²Ð½ÑÑÑенниÑ
ÑлеменÑов ÑÑого знаÑÐµÐ½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе добавиÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле @.
ÐапÑимеÑ, нÑжно полÑÑиÑÑ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð¿ÑлÑÑа вÑÑе 130. ÐÑо можно ÑделаÑÑ ÑледÑÑÑим обÑазом:
=>select jsonb_path_query(:'json', '$.track.segments[*].HR ? (@ > 130)');jsonb_path_query ------------------ 135
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð² ÑезÑлÑÑаÑе вÑÐµÐ¼Ñ Ð½Ð°Ñала ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑегменÑов, нÑжно оÑÑилÑÑÑоваÑÑ Ð½ÐµÐ½ÑжнÑе ÑегменÑÑ, а заÑем вÑбÑаÑÑ Ð²ÑемÑ, Ñак ÑÑо ÑилÑÑÑ Ð±ÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ðº пÑедÑдÑÑÐµÐ¼Ñ ÑÐ°Ð³Ñ Ð¸ пÑÑÑ Ð¾ÐºÐ°Ð¶ÐµÑÑÑ Ð´ÑÑгим:
=>select jsonb_path_query(:'json', '$.track.segments[*] ? (@.HR > 130)."start time"');jsonb_path_query ----------------------- "2018-10-14 10:39:21"
Ðожно Ñакже иÑполÑзоваÑÑ Ð½ÐµÑколÑко вÑÑажений ÑилÑÑÑа по оÑеÑеди, когда ÑÑо ÑÑебÑеÑÑÑ. ÐапÑимеÑ, ÑледÑÑÑее вÑÑажение вÑбиÑÐ°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð½Ð°Ñала вÑÐµÑ ÑегменÑов Ñ Ð¾Ð¿ÑеделÑннÑми кооÑдинаÑами и вÑÑоким показаÑелем пÑлÑÑа:
=>select jsonb_path_query(:'json', '$.track.segments[*] ? (@.location[1] < 13.4) ? (@.HR > 130)."start time"');jsonb_path_query ----------------------- "2018-10-14 10:39:21"
Также возможно иÑполÑзоваÑÑ ÑилÑÑÑÑ Ð½Ð° ÑазнÑÑ ÑÑовнÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи. Ð ÑледÑÑÑем пÑимеÑе ÑнаÑала ÑегменÑÑ ÑилÑÑÑÑÑÑÑÑ Ð¿Ð¾ кооÑдинаÑам, а заÑем Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ ÑегменÑов, еÑли они Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ, вÑбиÑаÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²ÑÑокого пÑлÑÑа:
=>select jsonb_path_query(:'json', '$.track.segments[*] ? (@.location[1] < 13.4).HR ? (@ > 130)');jsonb_path_query ------------------ 135
Ðожно Ñакже вкладÑваÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа одно в дÑÑгое. Ðанное вÑÑажение возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑегменÑов в ÑÑеке, еÑли он ÑодеÑÐ¶Ð¸Ñ ÑегменÑÑ Ñ Ð²ÑÑокими показаÑелÑми пÑлÑÑа, или пÑÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ, еÑли ÑÐ°ÐºÐ¸Ñ ÑегменÑов неÑ:
=>select jsonb_path_query(:'json', '$.track ? (exists(@.segments[*] ? (@.HR > 130))).segments.size()');jsonb_path_query ------------------ 2
9.16.2.1. ÐÑлиÑÐ¸Ñ Ð¾Ñ ÑÑандаÑÑа SQL #
РеализаÑÐ¸Ñ ÑзÑка пÑÑей SQL/JSON в Postgres Pro Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑие оÑлиÑÐ¸Ñ Ð¾Ñ ÑÑандаÑÑа SQL/JSON.
9.16.2.1.1. ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑовеÑки бÑлевÑÑ Ð¿ÑедикаÑов #
Ðак ÑаÑÑиÑение ÑÑандаÑÑа SQL, вÑÑажение пÑÑи Postgres Pro Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±ÑлевÑм пÑедикаÑом, Ñогда как ÑÑандаÑÑ SQL допÑÑÐºÐ°ÐµÑ Ð¿ÑедикаÑÑ ÑолÑко в ÑилÑÑÑаÑ
. Ð Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи ÑÑандаÑÑа SQL возвÑаÑаÑÑ ÑооÑвеÑÑÑвÑÑÑий ÑлеменÑ(Ñ) запÑоÑенного знаÑÐµÐ½Ð¸Ñ JSON, вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑовеÑки пÑедикаÑов возвÑаÑаÑÑ Ð¾Ð´Ð¸Ð½ из ÑÑÑÑ
возможнÑÑ
ÑезÑлÑÑаÑов Ñипа jsonb пÑовеÑки пÑедикаÑа: true, false или null. ÐапÑимеÑ, можно напиÑаÑÑ Ñакое вÑÑажение ÑилÑÑÑа ÑÑандаÑÑа SQL:
=>select jsonb_path_query(:'json', '$.track.segments ?(@[*].HR > 130)');jsonb_path_query -----------------------------------------------------------â---------------------- {"HR": 135, "location": [47.706, 13.2635], "start time": "2018-10-14 10:39:21"}
ÐналогиÑное вÑÑажение пÑовеÑки пÑедикаÑов пÑоÑÑо возвÑаÑÐ°ÐµÑ true, ÑказÑÐ²Ð°Ñ Ð½Ð° Ñо, ÑÑо Ñовпадение ÑÑÑеÑÑвÑеÑ:
=>select jsonb_path_query(:'json', '$.track.segments[*].HR > 130');jsonb_path_query ------------------ true
ÐÑимеÑание
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑовеÑки пÑедикаÑов обÑзаÑелÑÐ½Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа @@ (и ÑÑнкÑии jsonb_path_match) и не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑом @? (или ÑÑнкÑией jsonb_path_exists).
9.16.2.1.2. ÐнÑеÑпÑеÑаÑÐ¸Ñ ÑегÑлÑÑнÑÑ Ð²ÑÑажений #
ÐÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие ÑазлиÑÐ¸Ñ Ð² инÑеÑпÑеÑаÑии Ñаблонов ÑегÑлÑÑнÑÑ
вÑÑажений, иÑполÑзÑемÑÑ
в ÑилÑÑÑаÑ
like_regex; имеÑÑиеÑÑ Ð¾ÑобенноÑÑи опиÑÐ°Ð½Ñ Ð² ÐодÑазделе 9.16.2.4.
9.16.2.2. СÑÑогий и неÑÑÑогий ÑÐµÐ¶Ð¸Ð¼Ñ #
Ðогда Ð²Ñ Ð¾Ð±ÑаÑаеÑеÑÑ Ðº даннÑм JSON, вÑÑажение пÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑооÑвеÑÑÑвоваÑÑ ÑакÑиÑеÑкой ÑÑÑÑкÑÑÑе даннÑÑ JSON. ÐопÑÑка обÑаÑиÑÑÑÑ Ðº неÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÑÐ»ÐµÐ½Ñ Ð¾Ð±ÑекÑа или ÑлеменÑÑ Ð¼Ð°ÑÑива опÑеделÑеÑÑÑ ÐºÐ°Ðº оÑибка ÑÑÑÑкÑÑÑного Ñипа. ÐÐ»Ñ Ð¾Ð±ÑабоÑки Ñакого Ñода оÑибок в вÑÑажениÑÑ Ð¿ÑÑей SQL/JSON пÑедÑÑмоÑÑÐµÐ½Ñ Ð´Ð²Ð° Ñежима:
lax (по ÑмолÑаниÑ) â неÑÑÑогий Ñежим, в коÑоÑом обÑабоÑÑик пÑÑей неÑвно адапÑиÑÑÐµÑ Ð¾Ð±ÑабаÑÑваемÑе даннÑе к ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи. ÐÑбÑе ÑÑÑÑкÑÑÑнÑе оÑибки, коÑоÑÑе не могÑÑ Ð±ÑÑÑ ÑÑÑÑÐ°Ð½ÐµÐ½Ñ ÑказаннÑми ниже ÑпоÑобами, подавлÑÑÑÑÑ, и запÑÐ¾Ñ Ð½Ðµ возвÑаÑÐ°ÐµÑ Ð´Ð»Ñ Ð½Ð¸Ñ ÑовпадениÑ.
strict â ÑÑÑогий Ñежим, в коÑоÑом ÑÑÑÑкÑÑÑнÑе оÑибки вÑдаÑÑÑÑ ÐºÐ°Ðº еÑÑÑ.
ÐеÑÑÑогий Ñежим ÑпÑоÑÐ°ÐµÑ ÑопоÑÑавление докÑменÑа JSON Ñ Ð²ÑÑажением пÑÑи в ÑлÑÑаÑÑ , когда даннÑе JSON не ÑооÑвеÑÑÑвÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ð¹ ÑÑ ÐµÐ¼Ðµ. ÐÑли опеÑанд не ÑдовлеÑвоÑÑÐµÑ ÑÑебованиÑм опÑеделÑнной опеÑаÑии, он Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑед вÑполнением ÑÑой опеÑаÑии авÑомаÑиÑеÑки обоÑаÑиваÑÑÑÑ Ð² маÑÑив SQL/JSON или наобоÑоÑ, ÑазвоÑаÑиваÑÑÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐµÐ³Ð¾ ÑлеменÑÑ Ð¾Ð±Ñазовали поÑледоваÑелÑноÑÑÑ SQL/JSON. Также в неÑÑÑогом Ñежиме опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑки ÑазвоÑаÑиваÑÑ Ñвои опеÑандÑ, ÑÑо позволÑÐµÑ Ð»ÐµÐ³ÐºÐ¾ ÑÑавниваÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ SQL/JSON. ÐаÑÑив Ñ Ð¾Ð´Ð½Ð¸Ð¼ ÑлеменÑом в Ñаком Ñежиме ÑÑиÑаеÑÑÑ ÑавнÑм ÑÐ²Ð¾ÐµÐ¼Ñ ÑлеменÑÑ. ÐвÑомаÑиÑеÑкое ÑазвоÑаÑивание не вÑполнÑеÑÑÑ Ð² ÑледÑÑÑÐ¸Ñ ÑлÑÑаÑÑ :
РвÑÑажении пÑÑи ÑигÑÑиÑÑÑÑ Ð¼ÐµÑодÑ
size()иtype(), возвÑаÑаÑÑие ÑооÑвеÑÑÑвенно ÑиÑло ÑлеменÑов в маÑÑиве и Ñип.ÐбÑабаÑÑваемÑе даннÑе JSON ÑодеÑÐ¶Ð°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе маÑÑивÑ. Ð ÑÑом ÑлÑÑае ÑазвоÑаÑиваеÑÑÑ ÑолÑко маÑÑив веÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ, а внÑÑÑенние маÑÑÐ¸Ð²Ñ Ð¾ÑÑаÑÑÑÑ Ð±ÐµÐ· изменений. Таким обÑазом, неÑвное ÑазвоÑаÑивание Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑÑкаÑÑÑÑ Ð½Ð° каждом Ñаге вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи ÑолÑко на один ÑÑовенÑ.
ÐапÑимеÑ, обÑабаÑÑÐ²Ð°Ñ Ð´Ð°Ð½Ð½Ñе GPS, показаннÑе вÑÑе, в неÑÑÑогом Ñежиме можно не обÑаÑаÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ на Ñо, ÑÑо в Ð½Ð¸Ñ ÑодеÑжиÑÑÑ Ð¼Ð°ÑÑив ÑегменÑов:
=>select jsonb_path_query(:'json', 'lax $.track.segments.location');jsonb_path_query ------------------- [47.763, 13.4034] [47.706, 13.2635]
Ð ÑÑÑогом Ñежиме ÑказаннÑй пÑÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑоÑно ÑооÑвеÑÑÑвоваÑÑ ÑÑÑÑкÑÑÑе запÑаÑиваемого докÑменÑа JSON, поÑÑÐ¾Ð¼Ñ Ð¸ÑполÑзование ÑÑого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи вÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑибкÑ:
=>select jsonb_path_query(:'json', 'strict $.track.segments.location');ÐШÐÐÐÐ: вÑÑажение обÑаÑÐµÐ½Ð¸Ñ Ðº ÑÐ»ÐµÐ½Ñ Ð² jsonpath Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑолÑко к обÑекÑÑ
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ, ÑÑо и в неÑÑÑогом Ñежиме, нÑжно Ñвно ÑазвеÑнÑÑÑ Ð¼Ð°ÑÑив segments:
=>select jsonb_path_query(:'json', 'strict $.track.segments[*].location');jsonb_path_query ------------------- [47.763, 13.4034] [47.706, 13.2635]
Ðоведение ÑазвоÑаÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð² неÑÑÑогом Ñежиме Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð½ÐµÑколÑко неожиданнÑе ÑезÑлÑÑаÑÑ. ÐапÑимеÑ, ÑледÑÑÑий запÑÐ¾Ñ Ñ Ð¾Ð¿ÐµÑаÑоÑом обÑаÑÐµÐ½Ð¸Ñ .** вÑбеÑÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение HR дваждÑ:
=>select jsonb_path_query(:'json', 'lax $.**.HR');jsonb_path_query ------------------ 73 135 73 135
ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо опеÑаÑÐ¾Ñ .** вÑбиÑÐ°ÐµÑ Ð¸ маÑÑив segments, и каждÑй из его ÑлеменÑов, а обÑаÑение .HR в неÑÑÑогом Ñежиме авÑомаÑиÑеÑки ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑивÑ. Ðо избежание подобнÑÑ
ÑÑÑпÑизов Ð¼Ñ ÑекомендÑем иÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ .** ÑолÑко в ÑÑÑогом Ñежиме. СледÑÑÑий запÑÐ¾Ñ Ð²ÑбиÑÐ°ÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение HR в единÑÑвенном ÑкземплÑÑе:
=>select jsonb_path_query(:'json', 'strict $.**.HR');jsonb_path_query ------------------ 73 135
РазвÑÑÑÑвание маÑÑивов Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к неожиданнÑм ÑезÑлÑÑаÑам. РаÑÑмоÑÑим пÑимеÑ, в коÑоÑом вÑбиÑаÑÑÑÑ Ð²Ñе маÑÑÐ¸Ð²Ñ location:
=>select jsonb_path_query(:'json', 'lax $.track.segments[*].location');jsonb_path_query ------------------- [47.763, 13.4034] [47.706, 13.2635] (2 rows)
Ðак и ожидалоÑÑ, возвÑаÑаÑÑÑÑ Ð¿Ð¾Ð»Ð½Ñе маÑÑивÑ. Ðо пÑименение вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо маÑÑÐ¸Ð²Ñ ÑазвоÑаÑиваÑÑÑÑ Ð´Ð»Ñ Ð¾Ñенки каждого ÑлеменÑа, возвÑаÑÐ°Ñ ÑолÑко Ñе ÑлеменÑÑ, коÑоÑÑе ÑооÑвеÑÑÑвÑÑÑ Ð²ÑÑажениÑ:
=>select jsonb_path_query(:'json', 'lax $.track.segments[*].location ?(@[*] > 15)');jsonb_path_query ------------------ 47,763 47,706 (2 rows)
ÐÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð½ÐµÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо вÑÑажение пÑÑи вÑбиÑÐ°ÐµÑ Ð¿Ð¾Ð»Ð½Ñе маÑÑивÑ. ÐÑполÑзÑйÑе ÑÑÑогий Ñежим Ð´Ð»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑбоÑа ÑолÑко маÑÑивов:
=>select jsonb_path_query(:'json', 'strict $.track.segments[*].location ?(@[*] > 15)');jsonb_path_query ------------------- [47.763, 13.4034] [47.706, 13.2635] (2 rows)
9.16.2.3. ÐпеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ SQL/JSON #
РТаблиÑе 9.52 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¸ меÑодÑ, поддеÑживаемÑе в знаÑениÑÑ
jsonpath. ÐбÑаÑиÑе внимание, ÑÑо ÑнаÑнÑе опеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑименÑÑÑÑÑ Ðº множеÑÑÐ²Ñ Ð·Ð½Ð°Ñений, полÑÑеннÑÑ
на пÑедÑдÑÑем Ñаге пÑÑи, Ñогда как бинаÑнÑе опеÑаÑоÑÑ (Ñложение и Ñ. п.) пÑименÑÑÑÑÑ ÑолÑко к оÑделÑнÑм знаÑениÑм. РнеÑÑÑогом Ñежиме меÑодÑ, пÑименÑемÑе к маÑÑивÑ, бÑдÑÑ Ð¸ÑполнÑÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ Ð² маÑÑиве. ÐÑклÑÑениÑми ÑвлÑÑÑÑÑ .type() и .size(), коÑоÑÑе пÑименÑÑÑÑÑ Ðº ÑÐ°Ð¼Ð¾Ð¼Ñ Ð¼Ð°ÑÑивÑ.
ТаблиÑа 9.52. ÐпеÑаÑоÑÑ Ð¸ меÑÐ¾Ð´Ñ jsonpath
ÐпеÑаÑоÑ/ÐеÑод ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
Сложение
|
УнаÑнÑй плÑÑ (Ð½ÐµÑ Ð¾Ð¿ÐµÑаÑии); в оÑлиÑие Ð¾Ñ ÑложениÑ, он Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑеÑаÑионно пÑименÑÑÑÑÑ Ðº множеÑÑÐ²Ñ Ð·Ð½Ð°Ñений
|
ÐÑÑиÑание
|
Смена знака; в оÑлиÑие Ð¾Ñ Ð²ÑÑиÑаниÑ, ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑеÑаÑионно пÑименÑÑÑÑÑ Ðº множеÑÑÐ²Ñ Ð·Ð½Ð°Ñений
|
Умножение
|
Ðеление
|
ÐÑÑаÑок Ð¾Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ
|
Тип ÑлеменÑа JSON (Ñм.
|
Ð Ð°Ð·Ð¼ÐµÑ ÑлеменÑа JSON (ÑиÑло ÑлеменÑов в маÑÑиве либо 1, еÑли ÑÑо не маÑÑив)
|
ÐогиÑеÑкое знаÑение, пÑеобÑазованное из логиÑеÑкого знаÑÐµÐ½Ð¸Ñ JSON, ÑиÑла или ÑÑÑоки
|
СÑÑоковое знаÑение, пÑеобÑазованное из логиÑеÑкого знаÑÐµÐ½Ð¸Ñ JSON, ÑиÑла, ÑÑÑоки или знаÑÐµÐ½Ð¸Ñ Ñипа даÑа-вÑемÑ
|
ÐÑиблизиÑелÑное ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, пÑеобÑазованное из ÑÑÑоки или ÑиÑла JSON
|
ÐлижайÑее Ñелое, болÑÑее или Ñавное Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑиÑлÑ
|
ÐлижайÑее Ñелое, менÑÑее или Ñавное Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑиÑлÑ
|
ÐодÑÐ»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑиÑла (абÑолÑÑное знаÑение)
|
ÐолÑÑое ÑелоÑиÑленное знаÑение, пÑеобÑазованное из ÑиÑлового или ÑÑÑокового знаÑÐµÐ½Ð¸Ñ JSON
|
ÐкÑÑглÑнное деÑÑÑиÑное знаÑение, пÑеобÑазованное из ÑиÑлового или ÑÑÑокового знаÑÐµÐ½Ð¸Ñ JSON (знаÑениÑ
|
ЦелоÑиÑленное знаÑение, пÑеобÑазованное из ÑиÑлового или ÑÑÑокового знаÑÐµÐ½Ð¸Ñ JSON
|
ЧиÑловое знаÑение, пÑеобÑазованное из ÑиÑлового или ÑÑÑокового знаÑÐµÐ½Ð¸Ñ 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, не ÑÑиÑÑваÑÑиÑ
ÑаÑовой поÑÑ. ÐналогиÑно, в дÑÑгиÑ
меÑодаÑ
, ÑвÑзаннÑÑ
Ñ Ð´Ð°Ñой/вÑеменем и пÑеобÑазÑÑÑиÑ
ÑÑÑоки в ÑÐ¸Ð¿Ñ Ð´Ð°ÑÑ/вÑемени, Ñакже вÑполнÑеÑÑÑ ÑÑо пÑеобÑазование, в коÑоÑом Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑвоваÑÑ Ð¿Ð°ÑамеÑÑ TimeZone Ñ ÑекÑÑим знаÑением. ÐоÑÑÐ¾Ð¼Ñ ÑÑи пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñакже могÑÑ Ð²ÑполнÑÑÑÑÑ ÑолÑко в ÑÑнкÑиÑÑ
jsonpath Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой ÑаÑового поÑÑа.
РТаблиÑе 9.53 пеÑеÑиÑÐ»ÐµÐ½Ñ Ð´Ð¾Ð¿ÑÑÑимÑе ÑлеменÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа.
ТаблиÑа 9.53. ÐлеменÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑилÑÑÑа jsonpath
ÐÑедикаÑ/знаÑение ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐÑовеÑка ÑавенÑÑва (вÑе опеÑаÑоÑÑ ÑÑавнениÑ, вклÑÑÐ°Ñ ÑÑоÑ, ÑабоÑаÑÑ Ñ Ð»ÑбÑми ÑкалÑÑнÑми знаÑениÑми JSON)
|
ÐÑовеÑка неÑавенÑÑва
|
ÐÑовеÑка «менÑÑе»
|
ÐÑовеÑка «менÑÑе или Ñавно»
|
ÐÑовеÑка «болÑÑе»
|
ÐÑовеÑка «болÑÑе или Ñавно»
|
JSON-конÑÑанÑа
|
JSON-конÑÑанÑа
|
JSON-конÑÑанÑа
|
ÐогиÑеÑкое Ð
|
ÐогиÑеÑкое ÐÐÐ
|
ÐогиÑеÑкое ÐÐ
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸
|
ÐÑовеÑÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ пеÑвÑй опеÑанд ÑегÑлÑÑÐ½Ð¾Ð¼Ñ Ð²ÑÑажениÑ, коÑоÑое задаÑÑ Ð²ÑоÑой опеÑанд Ñ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм аÑгÑменÑом
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ вÑоÑой опеÑанд наÑалÑной подÑÑÑокой пеÑвого.
|
ÐÑовеÑÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи минимÑм один ÑÐ»ÐµÐ¼ÐµÐ½Ñ SQL/JSON. ÐозвÑаÑаеÑ
|
9.16.2.4. РегÑлÑÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ 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.7. ÐÑо в ÑаÑÑноÑÑи ознаÑаеÑ, ÑÑо каждÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð² ÑегÑлÑÑном вÑÑажении надо дÑблиÑоваÑÑ. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð¾ÑобÑаÑÑ ÑÑÑоковÑе знаÑениÑ, наÑ
одÑÑиеÑÑ Ð½Ð° ÑÑовне коÑÐ½Ñ Ð´Ð¾ÐºÑменÑа и ÑодеÑжаÑие ÑолÑко ÑиÑÑÑ, нÑжно напиÑаÑÑ:
$.* ? (@ like_regex "^\\d+$")
9.16.3. ФÑнкÑии запÑоÑов SQL/JSON #
ФÑнкÑии SQL/JSON JSON_EXISTS(), JSON_QUERY() и JSON_VALUE(), опиÑаннÑе в ТаблиÑа 9.54, можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов к докÑменÑам JSON. ÐÑе ÑÑи ÑÑнкÑии иÑполÑзÑÑÑ Ð²ÑÑажение_пÑÑи (запÑÐ¾Ñ Ð¿ÑÑи SQL/JSON) к ÑлеменÑÑ_конÑекÑÑа (докÑменÑÑ). Ðа более подÑобнÑм опиÑанием возможного ÑодеÑжимого вÑÑажениÑ_пÑÑи обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 9.16.2. РвÑÑажении_пÑÑи Ñакже можно ÑÑÑлаÑÑÑÑ Ð½Ð° пеÑеменнÑе, знаÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑÑ
ÑÐºÐ°Ð·Ð°Ð½Ñ Ñ ÑооÑвеÑÑÑвÑÑÑими именами в пÑедложении PASSING, коÑоÑое поддеÑживаеÑÑÑ Ð²Ñеми ÑÑнкÑиÑми. ÑлеменÑ_конÑекÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð½Ð°Ñением jsonb или ÑимволÑной ÑÑÑокой, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ñиведена к jsonb.
ТаблиÑа 9.54. ФÑнкÑии запÑоÑов SQL/JSON
СигнаÑÑÑа ÑÑнкÑии ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐÑимеÑÑ:
ÐШÐÐÐÐ: Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð°ÑÑива jsonpath вне диапазона |
ÐÑимеÑÑ:
ÐШÐÐÐÐ: оÑибоÑнÑй лиÑеÑал маÑÑива: "[1, 2]" ÐÐÐÐ ÐÐÐÐСТÐ: ÐоÑле ÑазмеÑноÑÑей маÑÑива оÑÑÑÑÑÑвÑÐµÑ "]". |
ÐÑимеÑÑ:
|
ÐÑимеÑание
ÐÑÑажение ÑлеменÑ_конÑекÑÑа неÑвно пÑиводиÑÑÑ Ðº ÑÐ¸Ð¿Ñ jsonb, еÑли пеÑедаÑÑÑÑ Ð½Ðµ ÑÑого Ñипа. Ðднако обÑаÑиÑе внимание, ÑÑо лÑбÑе оÑибки ÑазбоÑа, возникаÑÑие во вÑÐµÐ¼Ñ ÑÑого пÑеобÑазованиÑ, вÑдаÑÑÑÑ Ð±ÐµÐ·ÑÑловно, Ñо еÑÑÑ Ð½Ðµ обÑабаÑÑваÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ (ÑказаннÑм или неÑвнÑм) пÑедложением ON ERROR.
ÐÑимеÑание
ФÑнкÑÐ¸Ñ JSON_VALUE() возвÑаÑÐ°ÐµÑ SQL NULL, еÑли вÑÑажение_пÑÑи возвÑаÑÐ°ÐµÑ JSON null, в оÑлиÑие Ð¾Ñ ÑÑнкÑии JSON_QUERY(), возвÑаÑаÑÑей JSON null как еÑÑÑ.
9.16.4. JSON_TABLE #
JSON_TABLE â ÑÑо ÑÑнкÑÐ¸Ñ SQL/JSON, коÑоÑÐ°Ñ Ð¾Ð±ÑабаÑÑÐ²Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе JSON и вÑдаÑÑ ÑезÑлÑÑаÑÑ Ð² виде ÑелÑÑионного пÑедÑÑавлениÑ, к коÑоÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ обÑаÑаÑÑÑÑ ÐºÐ°Ðº к обÑÑной ÑаблиÑе SQL. ÐÑполÑзоваÑÑ JSON_TABLE можно внÑÑÑи пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FROM опеÑаÑоÑа SELECT, UPDATE или DELETE и как иÑÑоÑник даннÑÑ
в опеÑаÑоÑе MERGE.
ÐÑÐ¸Ð½Ð¸Ð¼Ð°Ñ Ð´Ð°Ð½Ð½Ñе JSON, ÑÑнкÑÐ¸Ñ JSON_TABLE обÑабаÑÑÐ²Ð°ÐµÑ Ð²ÑÑажение пÑÑи и Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑаÑÑÑ Ð¿ÑедÑÑавленнÑÑ
даннÑÑ
, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² каÑеÑÑве Ñаблона ÑÑÑок Ð´Ð»Ñ Ñоздаваемого пÑедÑÑавлениÑ. Ðаждое знаÑение SQL/JSON, вÑдаваемое Ñаблоном ÑÑÑок, ÑлÑÐ¶Ð¸Ñ Ð¸ÑÑоÑником Ð´Ð»Ñ Ð¾ÑделÑной ÑÑÑоки в Ñоздаваемом пÑедÑÑавлении.
ЧÑÐ¾Ð±Ñ ÑазбиÑÑ Ñаблон ÑÑÑок на ÑÑолбÑÑ, в ÑÑнкÑии JSON_TABLE пÑименÑеÑÑÑ Ð¿Ñедложение COLUMNS, опÑеделÑÑÑее ÑÑ
ÐµÐ¼Ñ Ñоздаваемого пÑедÑÑавлениÑ. Ð ÑÑом пÑедложении Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñоздаваемого ÑÑолбÑа задаÑÑÑÑ Ð¾ÑделÑное вÑÑажение пÑÑи, обÑабаÑÑваÑÑее Ñаблон ÑÑÑок, извлекаÑÑее ÑÐ»ÐµÐ¼ÐµÐ½Ñ JSON и возвÑаÑаÑÑее его в виде оÑделÑного знаÑÐµÐ½Ð¸Ñ SQL Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑÑолбÑа.
ÐаннÑе JSON, Ñ
ÑанÑÑиеÑÑ Ð½Ð° вложенном ÑÑовне Ñаблона ÑÑÑок, можно извлеÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ NESTED PATH. Ðаждое пÑедложение NESTED PATH можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑии одного или неÑколÑкиÑ
ÑÑолбÑов Ñ Ð¸ÑполÑзованием даннÑÑ
из вложенного ÑÑÐ¾Ð²Ð½Ñ Ñаблона ÑÑÑок. ÐÑи ÑÑолбÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ Ð² пÑедложении COLUMNS, коÑоÑое аналогиÑно пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ COLUMNS веÑÑ
него ÑÑовнÑ. СÑÑоки, ÑгенеÑиÑованнÑе из NESTED COLUMNS, назÑваÑÑÑÑ Ð´Ð¾ÑеÑними ÑÑÑоками и обÑединÑÑÑÑÑ Ñо ÑÑÑокой, Ñозданной из ÑÑолбÑов, коÑоÑÑе ÑÐºÐ°Ð·Ð°Ð½Ñ Ð² ÑодиÑелÑÑком пÑедложении COLUMNS, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑÑÐ¾ÐºÑ Ð² конеÑном пÑедÑÑавлении. Сами доÑеÑние ÑÑолбÑÑ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ ÑпеÑиÑикаÑÐ¸Ñ NESTED PATH, ÑÑо позволÑÐµÑ Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÑÑ Ð´Ð°Ð½Ð½Ñе, ÑаÑположеннÑе на пÑоизволÑнÑÑ
ÑÑовнÑÑ
вложенноÑÑи. СÑолбÑÑ, ÑозданнÑе неÑколÑкими NESTED PATH на одном ÑÑовне, ÑÑиÑаÑÑÑÑ ÑоÑедними, а иÑ
ÑÑÑоки поÑле ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑодиÑелÑÑкой ÑÑÑокой обÑединÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ UNION.
СÑÑоки, ÑоÑмиÑÑемÑе ÑÑнкÑией JSON_TABLE, ÑоединÑÑÑÑÑ ÐºÐ°Ðº поÑледÑÑÑие (LATERAL) Ñо ÑÑÑокой, из коÑоÑой они ÑÑоÑмиÑованÑ, поÑÑÐ¾Ð¼Ñ Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи Ñвно ÑоединÑÑÑ Ñоздаваемое пÑедÑÑавление Ñ Ð¸ÑÑ
одной ÑаблиÑей, ÑодеÑжаÑей даннÑе JSON.
СинÑакÑиÑ:
JSON_TABLE (
ÑлеменÑ_конÑекÑÑа, вÑÑажение_пÑÑи [AS имÑ_пÑÑи_json] [PASSING { знаÑение AS имÑ_пеÑеменной } [, ...]]
COLUMNS ( ÑÑолбеÑ_ÑаблиÑÑ_json [, ...] )
[{ ERROR | EMPTY [ARRAY]} ON ERROR]
)
ÐдеÑÑ ÑÑолбеÑ_ÑаблиÑÑ_json:
Ð¸Ð¼Ñ FOR ORDINALITY
| Ð¸Ð¼Ñ Ñип
[FORMAT JSON [ENCODING UTF8]]
[PATH вÑÑажение_пÑÑи]
[{ WITHOUT | WITH { CONDITIONAL | [UNCONDITIONAL] } } [ARRAY] WRAPPER]
[{ KEEP | OMIT } QUOTES [ON SCALAR STRING]]
[{ ERROR | NULL | EMPTY { [ARRAY] | OBJECT } | DEFAULT вÑÑажение } ON EMPTY]
[{ ERROR | NULL | EMPTY { [ARRAY] | OBJECT } | DEFAULT вÑÑажение } ON ERROR]
| Ð¸Ð¼Ñ Ñип EXISTS [PATH вÑÑажение_пÑÑи]
[{ ERROR | TRUE | FALSE | UNKNOWN } ON ERROR]
| NESTED [PATH] вÑÑажение_пÑÑи [AS имÑ_пÑÑи_json] COLUMNS ( ÑÑолбеÑ_ÑаблиÑÑ_json [, ...] )ÐаждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑинÑакÑиÑа опиÑан ниже более подÑобно.
-
ÑлеменÑ_конÑекÑÑа,вÑÑажение_пÑÑи[ASимÑ_пÑÑи_json] [PASSING{знаÑениеASимÑ_пеÑеменной} [, ...]] ÐÑÑажение
ÑлеменÑ_конÑекÑÑаÑказÑÐ²Ð°ÐµÑ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ докÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа,вÑÑажение_пÑÑиâ ÑÑо вÑÑажение пÑÑи SQL/JSON, опÑеделÑÑÑее запÑоÑ, аимÑ_пÑÑи_jsonâ необÑзаÑелÑное Ð¸Ð¼Ñ Ð´Ð»ÑвÑÑажениÑ_пÑÑи. ÐеобÑзаÑелÑное пÑедложениеPASSINGÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð¿ÐµÑеменнÑÑ , ÑказаннÑÑ Ð²Ð²ÑÑажении_пÑÑи. РезÑлÑÑÐ°Ñ Ð¾Ð±ÑабоÑки Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ñ Ð¸ÑполÑзованием вÑÑеÑпомÑнÑÑÑÑ ÑлеменÑов назÑваеÑÑÑ Ñаблоном ÑÑÑок, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð² каÑеÑÑве иÑÑоÑника Ð´Ð»Ñ Ð·Ð½Ð°Ñений ÑÑÑок в Ñоздаваемом пÑедÑÑавлении.COLUMNS(ÑÑолбеÑ_ÑаблиÑÑ_json[, ...] )ÐÑедложение
COLUMNS, опÑеделÑÑÑее ÑÑ ÐµÐ¼Ñ ÑконÑÑÑÑиÑованного пÑедÑÑавлениÑ. Ð ÑÑом пÑедложении можно ÑказаÑÑ, ÑÑо каждÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½ знаÑением SQL/JSON, полÑÑеннÑм пÑÑÑм пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи JSON к ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑÑÑок. ÐÑÑÑ ÑледÑÑÑие ваÑианÑÑÑÑолбÑа_ÑаблиÑÑ_json:-
имÑFOR ORDINALITY ÐобавлÑÐµÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ð½ÑмеÑаÑии, коÑоÑÑй обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¿Ð¾ÑледоваÑелÑнÑÑ Ð½ÑмеÑаÑÐ¸Ñ ÑÑÑок, наÑÐ¸Ð½Ð°Ñ Ñ 1. Ðаждое вÑÑажение
NESTED PATH(Ñм. ниже) полÑÑÐ°ÐµÑ ÑобÑÑвеннÑй ÑÑÑÑÑик Ð´Ð»Ñ Ð»ÑбÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ ÑÑолбÑов нÑмеÑаÑии.-
имÑÑип[FORMAT JSON[ENCODINGUTF8]] [PATHвÑÑажение_пÑÑи] ÐÑÑавлÑÐµÑ Ð·Ð½Ð°Ñение SQL/JSON, полÑÑенное пÑÑÑм пÑименениÑ
вÑÑажениÑ_пÑÑик ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑÑÑок, в вÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÑÐ¾ÐºÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ к ÑказанномÑÑипÑ.FORMAT JSONÑвно ÑказÑваеÑ, ÑÑо ожидаеÑÑÑ Ð´Ð¾Ð¿ÑÑÑимÑй обÑекÑjson. УказÑваÑÑFORMAT JSONÐ¸Ð¼ÐµÐµÑ ÑмÑÑл ÑолÑко в Ñом ÑлÑÑае, еÑлиÑипâ ÑÑоbpchar,bytea,character variationing,name,json,jsonbилиtextили домен над ÑÑими Ñипами.ЧÑÐ¾Ð±Ñ ÑоÑмаÑиÑоваÑÑ Ð²Ñвод, Ñакже можно ÑказаÑÑ Ð¿ÑедложениÑ
WRAPPERиQUOTES. ÐбÑаÑиÑе внимание, ÑÑо ÑказаниеOMIT QUOTESпеÑеопÑеделÑеÑFORMAT JSON, поÑколÑÐºÑ Ð½Ðµ заклÑÑÑннÑе в кавÑÑки лиÑеÑÐ°Ð»Ñ Ð½Ðµ ÑвлÑÑÑÑÑ Ð´Ð¾Ð¿ÑÑÑимÑми знаÑениÑмиjson.Также можно иÑполÑзоваÑÑ Ð¿ÑедложениÑ
ON EMPTYиON ERROR, ÑÑÐ¾Ð±Ñ Ð²ÑдавалаÑÑ Ð¾Ñибка или возвÑаÑалоÑÑ Ñказанное знаÑение пÑи пÑÑÑом ÑезÑлÑÑаÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи JSON и пÑи возникновении оÑибки во вÑÐµÐ¼Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи JSON или пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ SQL/JSON к ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ ÑооÑвеÑÑÑвенно. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ ÑлÑÑаев возвÑаÑаеÑÑÑ Ð·Ð½Ð°ÑениеNULL.ÐÑимеÑание
ÐÑо пÑедложение внÑÑÑи пÑеобÑазÑеÑÑÑ Ð²
JSON_VALUEилиJSON_QUERYÑ ÑооÑвеÑÑÑвÑÑÑей ÑеманÑикой. ÐÑедложение пÑеобÑазÑеÑÑÑ Ð²JSON_QUERY, еÑли ÑказаннÑй Ñип не ÑвлÑеÑÑÑ ÑкалÑÑнÑм Ñипом или пÑиÑÑÑÑÑвÑÐµÑ Ð¾Ð´Ð½Ð¾ из ÑледÑÑÑÐ¸Ñ Ð¿Ñедложений:FORMAT JSON,WRAPPERилиQUOTES.-
имÑÑипEXISTS[PATHвÑÑажение_пÑÑи] ÐÑÑавлÑÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое знаÑение, полÑÑенное пÑÑÑм пÑименениÑ
вÑÑажениÑ_пÑÑик ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑÑÑок, в вÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÑÐ¾ÐºÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐµÑ Ðº ÑказанномÑÑипÑ.ÐнаÑение показÑваеÑ, бÑдÑÑ Ð»Ð¸ полÑÑÐµÐ½Ñ ÐºÐ°ÐºÐ¸Ðµ-либо знаÑÐµÐ½Ð¸Ñ Ð² ÑезÑлÑÑаÑе пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑÑажениÑ
PATHк ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑÑÑок.УказаннÑй
Ñипдолжен имеÑÑ Ð¿Ñиведение к ÑипÑboolean.Также можно иÑполÑзоваÑÑ Ð¿Ñедложение
ON ERROR, ÑÑÐ¾Ð±Ñ Ð²ÑдавалаÑÑ Ð¾Ñибка или возвÑаÑалоÑÑ Ñказанное знаÑение пÑи возникновении оÑибки во вÑÐµÐ¼Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи JSON или пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ SQL/JSON к ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑипÑ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð² Ð¾Ð±Ð¾Ð¸Ñ ÑлÑÑаÑÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð·Ð½Ð°ÑениеNULL.ÐÑимеÑание
ÐÑо пÑедложение внÑÑÑи пÑеобÑазÑеÑÑÑ Ð²
JSON_EXISTSÑ ÑооÑвеÑÑÑвÑÑÑей ÑеманÑикой.NESTED [ PATH ]вÑÑажение_пÑÑи[ASимÑ_пÑÑи_json]COLUMNS(ÑÑолбеÑ_ÑаблиÑÑ_json[, ...] )ÐÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ SQL/JSON из вложеннÑÑ ÑÑовней Ñаблона ÑÑÑок, ÑоздаÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко ÑÑолбÑов, как опÑеделено во вложенном пÑедложении
COLUMNS, и вÑÑавлÑÐµÑ Ð¸Ð·Ð²Ð»ÐµÑÑннÑе знаÑÐµÐ½Ð¸Ñ SQL/JSON в ÑÑи ÑÑолбÑÑ. ÐÑÑажениеÑÑолбеÑ_ÑаблиÑÑ_jsonво вложенном пÑедложенииCOLUMNSÐ¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑинÑакÑиÑ, ÑÑо и в ÑодиÑелÑÑком пÑедложенииCOLUMNS.СинÑакÑиÑ
NESTED PATHÑвлÑеÑÑÑ ÑекÑÑÑивнÑм, поÑÑÐ¾Ð¼Ñ Ð²ÐºÐ»Ð°Ð´ÑÐ²Ð°Ñ Ð¾Ð´Ð½Ð¾ пÑедложениеNESTED PATHв дÑÑгое, можно опÑÑкаÑÑÑÑ Ð½Ð¸Ð¶Ðµ Ð¾Ñ ÑÑÐ¾Ð²Ð½Ñ Ðº ÑÑовнÑ. ÐÑо позволÑÐµÑ ÑазвеÑнÑÑÑ Ð¸ÐµÑаÑÑ Ð¸Ñ Ð¾Ð±ÑекÑов и маÑÑивов JSON в одном вÑзове ÑÑнкÑии, а не ÑвÑзÑваÑÑ Ð½ÐµÑколÑко вÑÑаженийJSON_TABLEв опеÑаÑоÑе SQL.
ÐÑимеÑание
Ðо вÑÐµÑ Ð²Ð°ÑианÑаÑ
ÑÑолбÑа_ÑаблиÑÑ_json, опиÑаннÑÑ Ð²ÑÑе, еÑли не Ñказано пÑедложениеPATH, иÑполÑзÑеÑÑÑ Ð²ÑÑажение пÑÑи$., гдеимÑимÑâ Ñказанное Ð¸Ð¼Ñ ÑÑолбÑа.-
-
ASимÑ_пÑÑи_json ÐеобÑзаÑелÑнÑй паÑамеÑÑ
имÑ_пÑÑи_jsonÑлÑÐ¶Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом заданноговÑÑажениÑ_пÑÑи. ÐÐ¼Ñ Ð¿ÑÑи должно бÑÑÑ ÑникалÑнÑм и оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн ÑÑолбÑов.- {
ERROR|EMPTY}ON ERROR ÐеобÑзаÑелÑное пÑедложение
ON ERRORможно иÑполÑзоваÑÑ Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑпоÑоба обÑабоÑки оÑибок пÑи вÑÑиÑлениивÑÑажениÑ_пÑÑивеÑÑ Ð½ÐµÐ³Ð¾ ÑÑовнÑ. ÐÑполÑзÑйÑе пÑедложениеERROR, ÑÑÐ¾Ð±Ñ Ð²ÑдавалиÑÑ Ð¾Ñибки, иEMPTY, ÑÑÐ¾Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑалаÑÑ Ð¿ÑÑÑÐ°Ñ ÑаблиÑа (Ñо еÑÑÑ ÑаблиÑа, ÑодеÑжаÑÐ°Ñ 0 ÑÑÑок). ÐбÑаÑиÑе внимание, ÑÑо ÑÑо пÑедложение не влиÑÐµÑ Ð½Ð° оÑибки, возникаÑÑие пÑи вÑÑиÑлении ÑÑолбÑов, поведение коÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð½Ð¸Ñ Ð¿ÑедложениÑON ERROR.
ÐÑимеÑÑ
РпÑиведÑннÑÑ Ð¿ÑимеÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑледÑÑÑÐ°Ñ ÑаблиÑа, ÑодеÑжаÑÐ°Ñ Ð´Ð°Ð½Ð½Ñе JSON:
CREATE TABLE my_films ( js jsonb );
INSERT INTO my_films VALUES (
'{ "favorites" : [
{ "kind" : "comedy", "films" : [
{ "title" : "Bananas",
"director" : "Woody Allen"},
{ "title" : "The Dinner Game",
"director" : "Francis Veber" } ] },
{ "kind" : "horror", "films" : [
{ "title" : "Psycho",
"director" : "Alfred Hitchcock" } ] },
{ "kind" : "thriller", "films" : [
{ "title" : "Vertigo",
"director" : "Alfred Hitchcock" } ] },
{ "kind" : "drama", "films" : [
{ "title" : "Yojimbo",
"director" : "Akira Kurosawa" } ] }
] }');Ð ÑледÑÑÑем запÑоÑе показано, как иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ JSON_TABLE Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов JSON-ÑаблиÑÑ my_films в пÑедÑÑавление, ÑодеÑжаÑее ÑÑолбÑÑ Ð´Ð»Ñ ÐºÐ»ÑÑей kind, title и director в иÑÑ
однÑÑ
даннÑÑ
JSON, а Ñакже ÑÑÐ¾Ð»Ð±ÐµÑ Ð½ÑмеÑаÑии:
SELECT jt.* FROM my_films, JSON_TABLE (js, '$.favorites[*]' COLUMNS ( id FOR ORDINALITY, kind text PATH '$.kind', title text PATH '$.films[*].title' WITH WRAPPER, director text PATH '$.films[*].director' WITH WRAPPER)) AS jt;
id | kind | title | director ----+----------+--------------------------------+---------------------------------- 1 | comedy | ["Bananas", "The Dinner Game"] | ["Woody Allen", "Francis Veber"] 2 | horror | ["Psycho"] | ["Alfred Hitchcock"] 3 | thriller | ["Vertigo"] | ["Alfred Hitchcock"] 4 | drama | ["Yojimbo"] | ["Akira Kurosawa"] (4 rows)
Ðиже пÑедÑÑавлена изменÑÐ½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð¸ÑполÑзованием аÑгÑменÑов PASSING в ÑилÑÑÑе, Ñказанном в вÑÑажении пÑÑи JSON веÑÑ
него ÑÑовнÑ, и ÑазлиÑнÑми паÑамеÑÑами Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
ÑÑолбÑов:
SELECT jt.* FROM
my_films,
JSON_TABLE (js, '$.favorites[*] ? (@.films[*].director == $filter)'
PASSING 'Alfred Hitchcock' AS filter
COLUMNS (
id FOR ORDINALITY,
kind text PATH '$.kind',
title text FORMAT JSON PATH '$.films[*].title' OMIT QUOTES,
director text PATH '$.films[*].director' KEEP QUOTES)) AS jt;id | kind | title | director ----+----------+---------+-------------------- 1 | horror | Psycho | "Alfred Hitchcock" 2 | thriller | Vertigo | "Alfred Hitchcock" (2 ÑÑÑоки)
Ðиже пÑедÑÑавлена изменÑÐ½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð¸ÑполÑзованием NESTED PATH Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑолбÑов title и director, демонÑÑÑиÑÑÑÑÐ°Ñ Ð¸Ñ
Ñоединение Ñ ÑодиÑелÑÑкими ÑÑолбÑами id и kind:
SELECT jt.* FROM
my_films,
JSON_TABLE ( js, '$.favorites[*] ? (@.films[*].director == $filter)'
PASSING 'Alfred Hitchcock' AS filter
COLUMNS (
id FOR ORDINALITY,
kind text PATH '$.kind',
NESTED PATH '$.films[*]' COLUMNS (
title text FORMAT JSON PATH '$.title' OMIT QUOTES,
director text PATH '$.director' KEEP QUOTES))) AS jt;id | kind | title | director ----+----------+---------+-------------------- 1 | horror | Psycho | "Alfred Hitchcock" 2 | thriller | Vertigo | "Alfred Hitchcock" (2 rows)
Ðиже пÑедÑÑавлен ÑÐ¾Ñ Ð¶Ðµ запÑоÑ, но без ÑилÑÑÑа в коÑневом пÑÑи:
SELECT jt.* FROM
my_films,
JSON_TABLE ( js, '$.favorites[*]'
COLUMNS (
id FOR ORDINALITY,
kind text PATH '$.kind',
NESTED PATH '$.films[*]' COLUMNS (
title text FORMAT JSON PATH '$.title' OMIT QUOTES,
director text PATH '$.director' KEEP QUOTES))) AS jt;id | kind | title | director ----+----------+-----------------+-------------------- 1 | comedy | Bananas | "Woody Allen" 1 | comedy | The Dinner Game | "Francis Veber" 2 | horror | Psycho | "Alfred Hitchcock" 3 | thriller | Vertigo | "Alfred Hitchcock" 4 | drama | Yojimbo | "Akira Kurosawa" (5 rows)
Ðиже пÑедÑÑавлен еÑÑ Ð¾Ð´Ð¸Ð½ запÑоÑ, иÑполÑзÑÑÑий в каÑеÑÑве вÑ
однÑÑ
даннÑÑ
дÑÑгой обÑÐµÐºÑ JSON. РнÑм показано обÑединение «ÑоÑедей» Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑÑÑми NESTED $.movies[*] и $.books[*], а Ñакже иÑполÑзование ÑÑолбÑа FOR ORDINALITY на ÑÑовнÑÑ
NESTED (ÑÑолбÑÑ movie_id, book_id и author_id):
SELECT * FROM JSON_TABLE (
'{"favorites":
[{"movies":
[{"name": "One", "director": "John Doe"},
{"name": "Two", "director": "Don Joe"}],
"books":
[{"name": "Mystery", "authors": [{"name": "Brown Dan"}]},
{"name": "Wonder", "authors": [{"name": "Jun Murakami"}, {"name":"Craig Doe"}]}]
}]}'::json, '$.favorites[*]'
COLUMNS (
user_id FOR ORDINALITY,
NESTED '$.movies[*]'
COLUMNS (
movie_id FOR ORDINALITY,
mname text PATH '$.name',
director text),
NESTED '$.books[*]'
COLUMNS (
book_id FOR ORDINALITY,
bname text PATH '$.name',
NESTED '$.authors[*]'
COLUMNS (
author_id FOR ORDINALITY,
author_name text PATH '$.name'))));
user_id | movie_id | mname | director | book_id | bname | author_id | author_name
---------+----------+-------+----------+---------+---------+-----------+--------------
1 | 1 | One | John Doe | | | |
1 | 2 | Two | Don Joe | | | |
1 | | | | 1 | Mystery | 1 | Brown Dan
1 | | | | 2 | Wonder | 1 | Jun Murakami
1 | | | | 2 | Wonder | 2 | Craig Doe
(5 rows)