9.19. ФÑнкÑии и опеÑаÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами
РТаблиÑе 9.51 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¸Ð¼ÐµÑÑиеÑÑ ÑпеÑиалÑнÑе опеÑаÑоÑÑ Ð´Ð»Ñ Ñипов-маÑÑивов. ÐÑоме Ð½Ð¸Ñ Ð´Ð»Ñ Ð¼Ð°ÑÑивов опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¾Ð±ÑÑнÑе опеÑаÑоÑÑ ÑÑавнениÑ, показаннÑе в ТаблиÑе 9.1. ÐÑи опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ÑопоÑÑавлÑÑÑ ÑодеÑжимое маÑÑивов по ÑлеменÑам, иÑполÑзÑÑ Ð¿Ñи ÑÑом ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ B-деÑева, опÑеделÑннÑÑ Ð´Ð»Ñ Ñипа данного ÑлеменÑа по ÑмолÑаниÑ, и ÑпоÑÑдоÑиваÑÑ Ð¸Ñ Ð¿Ð¾ пеÑÐ²Ð¾Ð¼Ñ ÑазлиÑиÑ. РмногомеÑнÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ð°Ñ ÑлеменÑÑ Ð¿ÑоÑмаÑÑиваÑÑÑÑ Ð¿Ð¾ ÑÑÑокам (Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ñледней ÑазмеÑноÑÑи менÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑедÑ). ÐÑли ÑодеÑжимое двÑÑ Ð¼Ð°ÑÑивов ÑовпадаеÑ, а ÑазмеÑноÑÑи оÑлиÑаÑÑÑÑ, ÑезÑлÑÑÐ°Ñ Ð¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð¿ÐµÑвÑм оÑлиÑием в ÑазмеÑноÑÑÑÑ . (Ð PostgreSQL до веÑÑии 8.2 поведение бÑло дÑÑгим: два маÑÑива Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм ÑодеÑжимÑм ÑÑиÑалиÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми, даже еÑли ÑиÑло Ð¸Ñ ÑазмеÑноÑÑей и гÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑов ÑазлиÑалиÑÑ.)
ТаблиÑа 9.51. ÐпеÑаÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами
ÐпеÑаÑÐ¾Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐеÑвÑй маÑÑив ÑодеÑÐ¶Ð¸Ñ Ð²ÑоÑой (имееÑÑÑ Ð»Ð¸ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа вÑоÑого маÑÑива ÑавнÑй ÐµÐ¼Ñ Ð² пеÑвом)? (ÐовÑоÑÑÑÑиеÑÑ ÑлеменÑÑ ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ð° обÑиÑ
оÑнованиÑÑ
, поÑÑÐ¾Ð¼Ñ Ð¼Ð°ÑÑивÑ
|
ÐеÑвÑй маÑÑив ÑодеÑжиÑÑÑ Ð²Ð¾ вÑоÑом?
|
ÐаÑÑÐ¸Ð²Ñ Ð¿ÐµÑеÑекаÑÑÑÑ (Ñ Ð½Ð¸Ñ ÐµÑÑÑ Ð¾Ð±Ñие ÑлеменÑÑ)?
|
СоединÑÐµÑ Ð´Ð²Ð° маÑÑива. ÐÑли один из опеÑандов â NULL или пÑÑÑой маÑÑив, опеÑаÑÐ¾Ñ Ð½Ð¸ÐºÐ°Ðº не дейÑÑвÑеÑ; в пÑоÑивном ÑлÑÑае ÑиÑло ÑазмеÑноÑÑей маÑÑивов должно бÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм (ÑÑÐ¾Ñ ÑлÑÑай показан в пеÑвом пÑимеÑе) или могÑÑ Ð¾ÑлиÑаÑÑÑÑ Ð½Ð° один (ÑÑо иллÑÑÑÑиÑÑÐµÑ Ð²ÑоÑой пÑимеÑ).
|
ÐÑÑавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² наÑало маÑÑива (маÑÑив должен бÑÑÑ Ð¿ÑÑÑÑм или одномеÑнÑм).
|
ÐÑÑавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÐºÐ¾Ð½ÐµÑ Ð¼Ð°ÑÑива (маÑÑив должен бÑÑÑ Ð¿ÑÑÑÑм или одномеÑнÑм).
|
ÐодÑобнее поведение опеÑаÑоÑов Ñ Ð¼Ð°ÑÑивами опиÑано в Разделе 8.15. Ðа дополниÑелÑнÑми ÑведениÑми об опеÑаÑоÑÐ°Ñ , поддеÑживаÑÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑÑ, обÑаÑиÑеÑÑ Ðº РазделÑ 11.2.
РТаблиÑе 9.52 пеÑеÑиÑÐ»ÐµÐ½Ñ ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами. ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ð½Ð¸Ñ Ð¸ пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² Разделе 8.15.
ТаблиÑа 9.52. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами
ФÑнкÑÐ¸Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐобавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÐºÐ¾Ð½ÐµÑ Ð¼Ð°ÑÑива (Ñак же, как опеÑаÑоÑ
|
СоединÑÐµÑ Ð´Ð²Ð° маÑÑива (Ñак же, как опеÑаÑоÑ
|
ÐозвÑаÑÐ°ÐµÑ ÑекÑÑовое пÑедÑÑавление ÑазмеÑноÑÑей маÑÑива.
|
ÐозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив, заполненнÑй заданнÑм знаÑением и имеÑÑий ÑазмеÑноÑÑи, ÑказаннÑе во вÑоÑом аÑгÑменÑе. РнеобÑзаÑелÑном ÑÑеÑÑем аÑгÑменÑе могÑÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ñ Ð½Ð¸Ð¶Ð½Ð¸Ðµ гÑаниÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑазмеÑноÑÑи (по ÑмолÑаниÑ
|
ÐозвÑаÑÐ°ÐµÑ Ð´Ð»Ð¸Ð½Ñ Ñказанной ÑазмеÑноÑÑи маÑÑива. (ÐÐ»Ñ Ð¿ÑÑÑÑÑ Ð¸Ð»Ð¸ неÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑазмеÑноÑÑей маÑÑива вÑдаÑÑ Ð½Ðµ 0, а NULL.)
|
ÐозвÑаÑÐ°ÐµÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð³ÑаниÑÑ Ñказанной ÑазмеÑноÑÑи маÑÑива.
|
ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑазмеÑноÑÑей маÑÑива.
|
ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð¿ÐµÑвого вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð²ÑоÑого аÑгÑменÑа в маÑÑиве либо
|
ÐозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив позиÑий вÑеÑ
вÑ
ождений вÑоÑого аÑгÑменÑа в одномеÑном маÑÑиве, заданном пеÑвÑм аÑгÑменÑом. ÐÑа ÑÑнкÑÐ¸Ñ Ð¾Ð¿ÑеделÑÐµÑ ÑавенÑÑво как
|
ÐÑÑавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² наÑало маÑÑива (Ñак же, как опеÑаÑоÑ
|
УдалÑÐµÑ Ð¸Ð· маÑÑива вÑе ÑлеменÑÑ, ÑавнÑе Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ. ÐаÑÑив должен бÑÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑм. ÐÑа ÑÑнкÑÐ¸Ñ Ð¾Ð¿ÑеделÑÐµÑ ÑавенÑÑво как
|
ÐаменÑÐµÑ ÐºÐ°Ð¶Ð´Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива, ÑавнÑй вÑоÑÐ¾Ð¼Ñ Ð°ÑгÑменÑÑ, знаÑением ÑÑеÑÑего аÑгÑменÑа.
|
ÐÑедÑÑавлÑÐµÑ Ð²Ñе ÑлеменÑÑ Ð¼Ð°ÑÑива в виде ÑекÑÑовÑÑ
ÑÑÑок и обÑединÑÐµÑ ÑÑи ÑÑÑоки ÑеÑез ÑазделиÑелÑ, заданнÑй паÑамеÑÑом
|
ÐозвÑаÑÐ°ÐµÑ Ð²ÐµÑÑ Ð½ÑÑ Ð³ÑаниÑÑ Ñказанной ÑазмеÑноÑÑи маÑÑива.
|
ÐозвÑаÑÐ°ÐµÑ Ð¾Ð±Ñее ÑиÑло ÑлеменÑов в маÑÑиве (0, еÑли маÑÑив пÑÑÑ).
|
РазделÑÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð°ÑамеÑÑом
|
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑив в Ð½Ð°Ð±Ð¾Ñ ÑÑÑок. ÐлеменÑÑ Ð¼Ð°ÑÑива пÑоÑиÑÑваÑÑÑÑ Ð² поÑÑдке Ñ ÑанениÑ.
1 2
foo bar baz quux |
РазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ (возможно ÑазнÑÑ
Ñипов) в Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾ÑÑежей. ÐÑли маÑÑÐ¸Ð²Ñ Ð¸Ð¼ÐµÑÑ ÑазнÑÑ Ð´Ð»Ð¸Ð½Ñ, коÑÑежи дополнÑÑÑÑÑ Ð´Ð¾ болÑÑей Ð´Ð»Ð¸Ð½Ñ Ð·Ð½Ð°ÑениÑми
a | b ---+----- 1 | foo 2 | bar | baz |
ÐÑимеÑание
Рповедении string_to_array по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ PostgreSQL веÑÑий до 9.1 пÑоизоÑли два изменениÑ. Ðо-пеÑвÑÑ
, ÑÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¿ÑÑÑой маÑÑив (ÑодеÑжаÑий 0 ÑлеменÑов), а не NULL, когда вÑ
Ð¾Ð´Ð½Ð°Ñ ÑÑÑока Ð¸Ð¼ÐµÐµÑ Ð½ÑлевÑÑ Ð´Ð»Ð¸Ð½Ñ. Ðо-вÑоÑÑÑ
, еÑли в каÑеÑÑве ÑазделиÑÐµÐ»Ñ Ð·Ð°Ð´Ð°Ð½ NULL, ÑÑа ÑÑнкÑÐ¸Ñ ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ Ð¿Ð¾ Ñимволам, а не пÑоÑÑо возвÑаÑÐ°ÐµÑ NULL, как бÑло ÑанÑÑе.
ÐÑ Ñакже можеÑе ÑзнаÑÑ Ð¾Ð± агÑегаÑной ÑÑнкÑии, ÑабоÑаÑÑей Ñ Ð¼Ð°ÑÑивами, array_agg в Разделе 9.21.