9.18. ФÑнкÑии и опеÑаÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами
РТаблиÑе 9.48 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами.
ТаблиÑа 9.48. ÐпеÑаÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами
| ÐпеÑаÑÐ¾Ñ | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ |
|---|---|---|---|
= | Ñавно | ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] | t |
<> | не Ñавно | ARRAY[1,2,3] <> ARRAY[1,2,4] | t |
< | менÑÑе | ARRAY[1,2,3] < ARRAY[1,2,4] | t |
> | болÑÑе | ARRAY[1,4,3] > ARRAY[1,2,4] | t |
<= | менÑÑе или Ñавно | ARRAY[1,2,3] <= ARRAY[1,2,3] | t |
>= | болÑÑе или Ñавно | ARRAY[1,4,3] >= ARRAY[1,4,3] | t |
@> | ÑодеÑÐ¶Ð¸Ñ | ARRAY[1,4,3] @> ARRAY[3,1,3] | t |
<@ | ÑодеÑжиÑÑÑ Ð² | ARRAY[2,2,7] <@ ARRAY[1,7,4,2,6] | t |
&& | пеÑеÑеÑение (еÑÑÑ Ð¾Ð±Ñие ÑлеменÑÑ) | ARRAY[1,4,3] && ARRAY[2,1] | t |
|| | Ñоединение маÑÑива Ñ Ð¼Ð°ÑÑивом | ARRAY[1,2,3] || ARRAY[4,5,6] | {1,2,3,4,5,6} |
|| | Ñоединение маÑÑива Ñ Ð¼Ð°ÑÑивом | ARRAY[1,2,3] || ARRAY[[4,5,6], [7,8,9]] | {{1,2,3},{4,5,6},{7,8,9}} |
|| | Ñоединение ÑлеменÑа Ñ Ð¼Ð°ÑÑивом | 3 || ARRAY[4,5,6] | {3,4,5,6} |
|| | Ñоединение маÑÑива Ñ ÑлеменÑом | ARRAY[4,5,6] || 7 | {4,5,6,7} |
ÐпеÑаÑоÑÑ ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑÑивов (<, >= и Ñ. д.) ÑÑавниваÑÑ ÑодеÑжимое маÑÑивов по ÑлеменÑам, иÑполÑзÑÑ Ð¿Ñи ÑÑом ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ B-деÑева, опÑеделÑннÑÑ Ð´Ð»Ñ Ñипа данного ÑлеменÑа по ÑмолÑаниÑ, и ÑоÑÑиÑÑÑÑ Ð¸Ñ
по пеÑÐ²Ð¾Ð¼Ñ ÑазлиÑиÑ. РмногомеÑнÑÑ
маÑÑиваÑ
ÑлеменÑÑ Ð¿ÑоÑмаÑÑиваÑÑÑÑ Ð¿Ð¾ ÑÑÑокам (Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ñледней ÑазмеÑноÑÑи менÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑедÑ). ÐÑли ÑодеÑжимое двÑÑ
маÑÑивов ÑовпадаеÑ, а ÑазмеÑноÑÑи ÑазлиÑаÑÑÑÑ, ÑезÑлÑÑÐ°Ñ Ð¸Ñ
ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð¿ÐµÑвÑм оÑлиÑием в ÑазмеÑноÑÑÑÑ
. (Ð PostgreSQL до веÑÑии 8.2 поведение бÑло дÑÑгим: два маÑÑива Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм ÑодеÑжимом ÑÑиÑалиÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми, даже еÑли ÑиÑло иÑ
ÑазмеÑноÑÑей и гÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑов ÑазлиÑалиÑÑ.)
ÐпеÑаÑоÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи маÑÑивов (<@ и @>) ÑÑиÑаÑÑ Ð¾Ð´Ð¸Ð½ маÑÑив вложеннÑм в дÑÑгой, еÑли каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÐµÑвого вÑÑÑеÑаеÑÑÑ Ð²Ð¾ вÑоÑом. ÐовÑоÑÑÑÑиеÑÑ ÑлеменÑÑ ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ð° обÑиÑ
оÑнованиÑÑ
, поÑÑÐ¾Ð¼Ñ Ð¼Ð°ÑÑÐ¸Ð²Ñ ARRAY[1] и ARRAY[1,1] ÑÑиÑаÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñм дÑÑг в дÑÑга.
ÐодÑобнее поведение опеÑаÑоÑов Ñ Ð¼Ð°ÑÑивами опиÑано в Разделе 8.15. Ðа дополниÑелÑнÑми ÑведениÑми об опеÑаÑоÑÐ°Ñ , поддеÑживаÑÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑÑ, обÑаÑиÑеÑÑ Ðº РазделÑ 11.2.
РТаблиÑе 9.49 пеÑеÑиÑÐ»ÐµÐ½Ñ ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами. ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ð½Ð¸Ñ Ð¸ пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² Разделе 8.15.
ТаблиÑа 9.49. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами
| ФÑнкÑÐ¸Ñ | Тип ÑезÑлÑÑаÑа | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ |
|---|---|---|---|---|
| anyarray | добавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÐºÐ¾Ð½ÐµÑ Ð¼Ð°ÑÑива | array_append(ARRAY[1,2], 3) | {1,2,3} |
| anyarray | ÑоединÑÐµÑ Ð´Ð²Ð° маÑÑива | array_cat(ARRAY[1,2,3], ARRAY[4,5]) | {1,2,3,4,5} |
| int | возвÑаÑÐ°ÐµÑ ÑиÑло ÑазмеÑноÑÑей маÑÑива | array_ndims(ARRAY[[1,2,3], [4,5,6]]) | 2 |
| text | возвÑаÑÐ°ÐµÑ ÑекÑÑовое пÑедÑÑавление ÑазмеÑноÑÑей маÑÑива | array_dims(ARRAY[[1,2,3], [4,5,6]]) | [1:2][1:3] |
| anyarray | возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив, заполненнÑй заданнÑм знаÑением и имеÑÑий ÑказаннÑе ÑазмеÑноÑÑи, в коÑоÑÑÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð³ÑаниÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑлиÑна Ð¾Ñ 1 | array_fill(7, ARRAY[3], ARRAY[2]) | [2:4]={7,7,7} |
| int | возвÑаÑÐ°ÐµÑ Ð´Ð»Ð¸Ð½Ñ Ñказанной ÑазмеÑноÑÑи маÑÑива | array_length(array[1,2,3], 1) | 3 |
| int | возвÑаÑÐ°ÐµÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð³ÑаниÑÑ Ñказанной ÑазмеÑноÑÑи маÑÑива | array_lower('[0:2]=â{1,2,3}'::int[], 1) | 0 |
| int | возвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð¿ÐµÑвого Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð²ÑоÑого аÑгÑменÑа в маÑÑиве, наÑÐ¸Ð½Ð°Ñ Ñ ÑлеменÑа, вÑбиÑаемого ÑÑеÑÑим аÑгÑменÑом, либо Ñ Ð¿ÐµÑвого ÑлеменÑа (маÑÑив должен бÑÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑм) | array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon') | 2 |
| int[] | возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив Ñ Ð¿Ð¾Ð·Ð¸ÑиÑми вÑÐµÑ Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ð¹ вÑоÑого аÑгÑменÑа в маÑÑиве, задаваемÑм пеÑвÑм аÑгÑменÑом (маÑÑив должен бÑÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑм) | array_positions(ARRAY['A','A','B','A'], 'A') | {1,2,4} |
| anyarray | вÑÑавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² наÑало маÑÑива | array_prepend(1, ARRAY[2,3]) | {1,2,3} |
| anyarray | ÑдалÑÐµÑ Ð¸Ð· маÑÑива вÑе ÑлеменÑÑ, ÑавнÑе Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ (маÑÑив должен бÑÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑм) | array_remove(ARRAY[1,2,3,2], 2) | {1,3} |
| anyarray | заменÑÐµÑ Ð² маÑÑиве вÑе ÑлеменÑÑ, ÑавнÑе Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ, дÑÑгим знаÑением | array_replace(ARRAY[1,2,5,4], 5, 3) | {1,2,3,4} |
| text | вÑÐ²Ð¾Ð´Ð¸Ñ ÑлеменÑÑ Ð¼Ð°ÑÑива ÑеÑез заданнÑй ÑазделиÑÐµÐ»Ñ Ð¸ позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð·Ð°Ð¼ÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL | array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') | 1,2,3,*,5 |
| int | возвÑаÑÐ°ÐµÑ Ð²ÐµÑÑ Ð½ÑÑ Ð³ÑаниÑÑ Ñказанной ÑазмеÑноÑÑи маÑÑива | array_upper(ARRAY[1,8,3,7], 1) | 4 |
| int | возвÑаÑÐ°ÐµÑ Ð¾Ð±Ñее ÑиÑло ÑлеменÑов в маÑÑиве, либо 0, еÑли маÑÑив пÑÑÑ | cardinality(ARRAY[[1,2],[3,4]]) | 4 |
| text[] | ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ Ð½Ð° ÑлеменÑÑ Ð¼Ð°ÑÑива, иÑполÑзÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñй ÑазделиÑÐµÐ»Ñ Ð¸, возможно, Ð·Ð°Ð¼ÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð½Ð°Ñений NULL | string_to_array('xx~^~yy~â^~zz', '~^~', 'yy') | {xx,NULL,zz} |
| setof anyelement | ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑив в Ð½Ð°Ð±Ð¾Ñ ÑÑÑок | unnest(ARRAY[1,2]) | 1 2(2 ÑÑÑоки) |
| setof anyelement, anyelement [, ...] | ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ (возможно ÑазнÑÑ Ñипов) в Ð½Ð°Ð±Ð¾Ñ ÑÑÑок. ÐÑо допÑÑкаеÑÑÑ ÑолÑко в пÑедложении FROM; Ñм. ÐодÑаздел 7.2.1.4 | unnest(ARRAY[1,2],ARRAY['foo','bar','baz']) | 1 foo 2 bar NULL baz(3 ÑÑÑоки) |
Ð ÑÑнкÑиÑÑ
array_position и array_positions каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива ÑÑавниваеÑÑÑ Ñ Ð¸ÑкомÑм знаÑением по пÑинÑÐ¸Ð¿Ñ IS NOT DISTINCT FROM.
ФÑнкÑÐ¸Ñ array_position возвÑаÑÐ°ÐµÑ NULL, еÑли иÑкомое знаÑение не наÑ
одиÑÑÑ.
ФÑнкÑÐ¸Ñ array_positions возвÑаÑÐ°ÐµÑ NULL, ÑолÑко еÑли в каÑеÑÑве маÑÑива пеÑедаÑÑÑÑ NULL; еÑли же в маÑÑиве не наÑ
одиÑÑÑ Ð·Ð½Ð°Ñение, она возвÑаÑÐ°ÐµÑ Ð¿ÑÑÑой маÑÑив.
ÐÑли Ð´Ð»Ñ ÑÑнкÑии string_to_array в каÑеÑÑве ÑазделиÑÐµÐ»Ñ Ð·Ð°Ð´Ð°Ð½ NULL, каждÑй Ñимвол вÑ
одной ÑÑÑоки ÑÑÐ°Ð½ÐµÑ Ð¾ÑделÑнÑм ÑлеменÑом в полÑÑенном маÑÑиве. ÐÑли ÑазделиÑÐµÐ»Ñ Ð¿ÑÑÑÐ°Ñ ÑÑÑока, ÑÑÑока бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑена Ñеликом в маÑÑиве из одного ÑлеменÑа. РпÑоÑивном ÑлÑÑае вÑ
Ð¾Ð´Ð½Ð°Ñ ÑÑÑока ÑазбиваеÑÑÑ Ð¿Ð¾ вÑ
ождениÑм подÑÑÑоки, Ñказанной в каÑеÑÑве ÑазделиÑелÑ.
ÐÑли Ð´Ð»Ñ ÑÑнкÑии string_to_array паÑамеÑÑ Ð·Ð°Ð¼ÐµÐ½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL опÑÑен или Ñавен NULL, никакие подÑÑÑоки во вÑ
однÑÑ
даннÑÑ
не бÑдÑÑ Ð·Ð°Ð¼ÐµÐ½ÑÑÑÑÑ Ð½Ð° NULL. ÐÑли же паÑамеÑÑ Ð·Ð°Ð¼ÐµÐ½Ñ NULL опÑÑен или Ñавен NULL Ð´Ð»Ñ ÑÑнкÑии array_to_string, вÑе знаÑÐµÐ½Ð¸Ñ NULL пÑоÑÑо пÑопÑÑкаÑÑÑÑ Ð¸ никак не пÑедÑÑавлÑÑÑÑÑ Ð² вÑÑ
одной ÑÑÑоке.
ÐÑимеÑание
Рповедении string_to_array по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ PostgreSQL веÑÑий до 9.1 пÑоизоÑли два изменениÑ. Ðо-пеÑвÑÑ
, ÑÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¿ÑÑÑой маÑÑив (ÑодеÑжаÑий 0 ÑлеменÑов), а не NULL, когда вÑ
Ð¾Ð´Ð½Ð°Ñ ÑÑÑока Ð¸Ð¼ÐµÐµÑ Ð½ÑлевÑÑ Ð´Ð»Ð¸Ð½Ñ. Ðо-вÑоÑÑÑ
, еÑли в каÑеÑÑве ÑазделиÑÐµÐ»Ñ Ð·Ð°Ð´Ð°Ð½ NULL, ÑÑа ÑÑнкÑÐ¸Ñ ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ Ð¿Ð¾ Ñимволам, а не пÑоÑÑо возвÑаÑÐ°ÐµÑ NULL, как бÑло ÑанÑÑе.
ÐÑ Ñакже можеÑе ÑзнаÑÑ Ð¾Ð± агÑегаÑной ÑÑнкÑии, ÑабоÑаÑÑей Ñ Ð¼Ð°ÑÑивами, array_agg в Разделе 9.20.