8.15. ÐаÑÑÐ¸Ð²Ñ #
- 8.15.1. ÐбÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñипов маÑÑивов
- 8.15.2. Ðвод знаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива
- 8.15.3. ÐбÑаÑение к маÑÑивам
- 8.15.4. Ðзменение маÑÑивов
- 8.15.5. ÐоиÑк знаÑений в маÑÑиваÑ
- 8.15.6. СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ вÑводимÑÑ Ð·Ð½Ð°Ñений маÑÑива
- 8.15.2. Ðвод знаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива
Postgres Pro позволÑÐµÑ Ð¾Ð¿ÑеделÑÑÑ ÑÑолбÑÑ ÑаблиÑÑ ÐºÐ°Ðº многомеÑнÑе маÑÑÐ¸Ð²Ñ Ð¿ÐµÑеменной длинÑ. ÐлеменÑами маÑÑивов могÑÑ Ð±ÑÑÑ Ð»ÑбÑе вÑÑÑоеннÑе или опÑеделÑннÑе полÑзоваÑелÑми базовÑе ÑипÑ, пеÑеÑиÑлениÑ, ÑоÑÑавнÑе ÑипÑ, ÑипÑ-Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð¸Ð»Ð¸ доменÑ.
8.15.1. ÐбÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñипов маÑÑивов #
ЧÑÐ¾Ð±Ñ Ð¿ÑоиллÑÑÑÑиÑоваÑÑ Ð¸ÑполÑзование маÑÑивов, Ð¼Ñ Ñоздадим ÑакÑÑ ÑаблиÑÑ:
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
); Ðак показано, Ð´Ð»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñипа маÑÑива к Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñипа ÑлеменÑов добавлÑÑÑÑÑ ÐºÐ²Ð°Ð´ÑаÑнÑе Ñкобки ([]). ÐÐ¾ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð²ÑÑе команда ÑоздаÑÑ ÑаблиÑÑ sal_emp Ñо ÑÑолбÑами Ñипов text (name), одномеÑнÑй маÑÑив Ñ ÑлеменÑами integer (pay_by_quarter), пÑедÑÑавлÑÑÑий кваÑÑалÑнÑÑ Ð·Ð°ÑплаÑÑ ÑабоÑников, и двÑÑ
меÑнÑй маÑÑив Ñ ÑлеменÑами text (schedule), пÑедÑÑавлÑÑÑий неделÑнÑй гÑаÑик ÑабоÑника.
Ðоманда CREATE TABLE позволÑÐµÑ Ñакже ÑказаÑÑ ÑоÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑивов, напÑÐ¸Ð¼ÐµÑ Ñак:
CREATE TABLE tictactoe (
squares integer[3][3]
);Ðднако ÑекÑÑÐ°Ñ ÑеализаÑÐ¸Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÐµÑ Ð²Ñе ÑказаннÑе ÑазмеÑÑ, Ñ. е. ÑакÑиÑеÑки ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива оÑÑаÑÑÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑннÑм.
ТекÑÑÐ°Ñ ÑеализаÑÐ¸Ñ Ñакже не огÑаниÑÐ¸Ð²Ð°ÐµÑ ÑиÑло ÑазмеÑноÑÑей. ÐÑе ÑлеменÑÑ Ð¼Ð°ÑÑивов ÑÑиÑаÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа, вне завиÑимоÑÑи Ð¾Ñ ÐµÐ³Ð¾ ÑазмеÑа и ÑиÑла ÑазмеÑноÑÑей. ÐоÑÑÐ¾Ð¼Ñ Ñвно ÑказÑваÑÑ ÑиÑло ÑлеменÑов или ÑазмеÑноÑÑей в команде CREATE TABLE Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑолÑко Ð´Ð»Ñ Ð´Ð¾ÐºÑменÑиÑованиÑ, на меÑ
анизм ÑабоÑÑ Ñ Ð¼Ð°ÑÑивом ÑÑо не влиÑеÑ.
ÐÐ»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑÑ
маÑÑивов можно пÑименÑÑÑ Ð°Ð»ÑÑеÑнаÑивнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ñ ÐºÐ»ÑÑевÑм Ñловом ARRAY, ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑандаÑÑÑ SQL. СÑÐ¾Ð»Ð±ÐµÑ pay_by_quarter можно бÑло Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ñак:
pay_by_quarter integer ARRAY[4],
Ðли без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑазмеÑа маÑÑива:
pay_by_quarter integer ARRAY,
ÐамеÑÑÑе, ÑÑо и в ÑÑом ÑлÑÑае Postgres Pro не накладÑÐ²Ð°ÐµÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° ÑакÑиÑеÑкий ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива.
8.15.2. Ðвод знаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива #
ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð·Ð½Ð°Ñение маÑÑива в виде бÑквалÑной конÑÑанÑÑ, заклÑÑиÑе знаÑÐµÐ½Ð¸Ñ ÑлеменÑов в ÑигÑÑнÑе Ñкобки и ÑазделиÑе Ð¸Ñ Ð·Ð°Ð¿ÑÑÑми. (ÐÑли вам знаком C, Ð²Ñ Ð½Ð°Ð¹Ð´ÑÑе, ÑÑо ÑÑо Ð¿Ð¾Ñ Ð¾Ð¶Ðµ на ÑинÑакÑÐ¸Ñ Ð¸Ð½Ð¸ÑиализаÑии ÑÑÑÑкÑÑÑ Ð² C.) ÐÑ Ð¼Ð¾Ð¶ÐµÑе заклÑÑиÑÑ Ð·Ð½Ð°Ñение лÑбого ÑлеменÑа в двойнÑе кавÑÑки, а еÑли он ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿ÑÑÑе или ÑигÑÑнÑе Ñкобки, ÑÑо обÑзаÑелÑно нÑжно ÑделаÑÑ. (ÐодÑобнее ÑÑо опиÑано ниже.) Таким обÑазом, обÑий ÑоÑÐ¼Ð°Ñ ÐºÐ¾Ð½ÑÑанÑÑ Ð¼Ð°ÑÑива вÑглÑÐ´Ð¸Ñ Ñак:
'{ знаÑение1 ÑазделиÑÐµÐ»Ñ Ð·Ð½Ð°Ñение2 ÑазделиÑÐµÐ»Ñ ... }'
где ÑазделиÑÐµÐ»Ñ â Ñимвол, ÑказаннÑй в каÑеÑÑве ÑазделиÑÐµÐ»Ñ Ð² ÑооÑвеÑÑÑвÑÑÑей запиÑи в ÑаблиÑе pg_type. ÐÐ»Ñ ÑÑандаÑÑнÑÑ
Ñипов даннÑÑ
, ÑÑÑеÑÑвÑÑÑиÑ
в диÑÑÑибÑÑиве Postgres Pro, ÑазделиÑелем ÑвлÑеÑÑÑ Ð·Ð°Ð¿ÑÑÐ°Ñ (,), за иÑклÑÑением лиÑÑ Ñипа box, в коÑоÑом ÑазделиÑÐµÐ»Ñ âÑоÑка Ñ Ð·Ð°Ð¿ÑÑой (;). Ðаждое знаÑение здеÑÑ â ÑÑо либо конÑÑанÑа Ñипа ÑлеменÑа маÑÑива, либо вложеннÑй маÑÑив. ÐапÑимеÑ, конÑÑанÑа маÑÑива Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñакой:
'{{1,2,3},{4,5,6},{7,8,9}}'ÐÑа конÑÑанÑа опÑеделÑÐµÑ Ð´Ð²ÑÑ Ð¼ÐµÑнÑй маÑÑив 3x3, ÑоÑÑоÑÑий из ÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ Ð¼Ð°ÑÑивов ÑелÑÑ ÑиÑел.
ЧÑÐ¾Ð±Ñ Ð¿ÑиÑвоиÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива знаÑение NULL, доÑÑаÑоÑно пÑоÑÑо напиÑаÑÑ NULL (ÑегиÑÑÑ Ñимволов пÑи ÑÑом не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ). ÐÑли же ÑÑебÑеÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð² маÑÑив ÑÑÑокÑ, ÑодеÑжаÑÑÑ Â«NULL», ÑÑо Ñлово нÑжно заклÑÑиÑÑ Ð² двойнÑе кавÑÑки.
(Такого Ñода конÑÑанÑÑ Ð¼Ð°ÑÑивов на Ñамом деле пÑедÑÑавлÑÑÑ Ñобой вÑего лиÑÑ ÑаÑÑнÑй ÑлÑÑай конÑÑанÑ, опиÑаннÑÑ Ð² ÐодÑазделе 4.1.2.7. ÐонÑÑанÑа изнаÑалÑно воÑпÑинимаеÑÑÑ ÐºÐ°Ðº ÑÑÑока и пеÑедаÑÑÑÑ Ð¿ÑоÑедÑÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ маÑÑива. ÐÑи ÑÑом Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ñвно ÑказаÑÑ Ñелевой Ñип.)
ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ показаÑÑ Ð½ÐµÑколÑко опеÑаÑоÑов INSERT:
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {"training", "presentation"}}');
INSERT INTO sal_emp
VALUES ('Carol',
'{20000, 25000, 25000, 25000}',
'{{"breakfast", "consulting"}, {"meeting", "lunch"}}');РезÑлÑÑÐ°Ñ Ð´Ð²ÑÑ Ð¿ÑедÑдÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´:
SELECT * FROM sal_emp;
name | pay_by_quarter | schedule
-----+-------------------------+--------------------------------------
Bill |{10000,10000,10000,10000}|{{meeting,lunch},{training,presentation}}
Carol|{20000,25000,25000,25000}|{{breakfast,consulting},{meeting,lunch}}
(2 rows)РмногомеÑнÑÑ Ð¼Ð°ÑÑивов ÑиÑло ÑлеменÑов в каждой ÑазмеÑноÑÑи должно бÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм; в пÑоÑивном ÑлÑÑае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка. ÐапÑимеÑ:
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {"meeting"}}');
ÐШÐÐÐÐ: Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑнÑÑ
маÑÑивов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑооÑвеÑÑÑвÑÑÑими ÑазмеÑноÑÑÑмиТакже можно иÑполÑзоваÑÑ ÑинÑакÑÐ¸Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа ARRAY:
INSERT INTO sal_emp
VALUES ('Bill',
ARRAY[10000, 10000, 10000, 10000],
ARRAY[['meeting', 'lunch'], ['training', 'presentation']]);
INSERT INTO sal_emp
VALUES ('Carol',
ARRAY[20000, 25000, 25000, 25000],
ARRAY[['breakfast', 'consulting'], ['meeting', 'lunch']]); ÐамеÑÑÑе, ÑÑо ÑлеменÑÑ Ð¼Ð°ÑÑива здеÑÑ â ÑÑо пÑоÑÑÑе SQL-конÑÑанÑÑ Ð¸Ð»Ð¸ вÑÑажениÑ; и поÑÑомÑ, напÑÐ¸Ð¼ÐµÑ ÑÑÑоки бÑдÑÑ Ð·Ð°ÐºÐ»ÑÑаÑÑÑÑ Ð² одинаÑнÑе апоÑÑÑоÑÑ, а не в двойнÑе, как в бÑквалÑной конÑÑанÑе маÑÑива. Ðолее подÑобно конÑÑÑÑкÑÐ¾Ñ ARRAY обÑÑждаеÑÑÑ Ð² ÐодÑазделе 4.2.12.
8.15.3. ÐбÑаÑение к маÑÑивам #
Ðобавив даннÑе в ÑаблиÑÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑейÑи к вÑбоÑкам. СнаÑала Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð¶ÐµÐ¼, как полÑÑиÑÑ Ð¾Ð´Ð¸Ð½ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива. ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð¸Ð¼ÐµÐ½Ð° ÑоÑÑÑдников, заÑплаÑа коÑоÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð»Ð°ÑÑ Ð²Ð¾ вÑоÑом кваÑÑале:
SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2]; name ------- Carol (1 row)
ÐндекÑÑ ÑлеменÑов маÑÑива запиÑÑваÑÑÑÑ Ð² квадÑаÑнÑÑ
ÑкобкаÑ
. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð² Postgres Pro дейÑÑвÑÐµÑ ÑоглаÑение о нÑмеÑаÑии ÑлеменÑов маÑÑива Ñ 1, Ñо еÑÑÑ Ð² маÑÑиве из n ÑлеменÑов пеÑвÑм ÑÑиÑаеÑÑÑ array[1], а поÑледним â array[.n]
ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²ÑдаÑÑ Ð·Ð°ÑплаÑÑ Ð²ÑÐµÑ ÑоÑÑÑдников в ÑÑеÑÑем кваÑÑале:
SELECT pay_by_quarter[3] FROM sal_emp;
pay_by_quarter
----------------
10000
25000
(2 rows)ÐÑ Ñакже можем полÑÑаÑÑ Ð¾Ð±ÑÑнÑе пÑÑмоÑголÑнÑе ÑÑÐµÐ·Ñ Ð¼Ð°ÑÑива, Ñо еÑÑÑ Ð¿Ð¾Ð´Ð¼Ð°ÑÑивÑ. СÑез маÑÑива обознаÑаеÑÑÑ ÐºÐ°Ðº Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ или неÑколÑкиÑ
ÑазмеÑноÑÑей. ÐапÑимеÑ, ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð¿ÐµÑвÑе пÑнкÑÑ Ð² гÑаÑике Ðилла в пеÑвÑе два Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸: нижнÑÑ-гÑаниÑа:веÑÑ
нÑÑ-гÑаниÑа
SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
schedule
------------------------
{{meeting},{training}}
(1 row) ÐÑли одна из ÑазмеÑноÑÑей запиÑана в виде ÑÑеза, Ñо еÑÑÑ ÑодеÑÐ¶Ð¸Ñ Ð´Ð²Ð¾ÐµÑоÑие, Ñогда ÑÑез ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° вÑе ÑазмеÑноÑÑи. ÐÑли пÑи ÑÑом Ð´Ð»Ñ ÑазмеÑноÑÑи ÑказÑваеÑÑÑ ÑолÑко одно ÑиÑло (без двоеÑоÑиÑ), в ÑÑез войдÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾Ñ 1 до заданного номеÑа. ÐапÑимеÑ, в ÑÑом пÑимеÑе [2] бÑÐ´ÐµÑ ÑавнознаÑно [1:2]:
SELECT schedule[1:2][2] FROM sal_emp WHERE name = 'Bill';
schedule
-------------------------------------------
{{meeting,lunch},{training,presentation}}
(1 row) Ðо избежание пÑÑаниÑÑ Ñ Ð¾Ð±ÑаÑением к Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑлеменÑÑ, ÑÑÐµÐ·Ñ Ð»ÑÑÑе вÑегда запиÑÑваÑÑ Ñвно Ð´Ð»Ñ Ð²ÑеÑ
измеÑений, напÑÐ¸Ð¼ÐµÑ [1:2][1:1] вмеÑÑо [2][1:1].
ÐнаÑÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ð½ÑÑ-гÑаниÑа и/или веÑÑ
нÑÑ-гÑаниÑа в Ñказании ÑÑеза можно опÑÑÑиÑÑ; опÑÑÐµÐ½Ð½Ð°Ñ Ð³ÑаниÑа заменÑеÑÑÑ Ð½Ð¸Ð¶Ð½Ð¸Ð¼ или веÑÑ
ним пÑеделом индекÑов маÑÑива. ÐапÑимеÑ:
SELECT schedule[:2][2:] FROM sal_emp WHERE name = 'Bill';
schedule
------------------------
{{lunch},{presentation}}
(1 row)
SELECT schedule[:][1:1] FROM sal_emp WHERE name = 'Bill';
schedule
------------------------
{{meeting},{training}}
(1 row)ÐÑÑажение обÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑÑ Ð¼Ð°ÑÑива возвÑаÑÐ¸Ñ NULL, еÑли Ñам маÑÑив или одно из вÑÑажений индекÑов ÑлеменÑа ÑÐ°Ð²Ð½Ñ NULL. ÐнаÑение NULL Ñакже возвÑаÑаеÑÑÑ, еÑли Ð¸Ð½Ð´ÐµÐºÑ Ð²ÑÑ
Ð¾Ð´Ð¸Ñ Ð·Ð° гÑаниÑÑ Ð¼Ð°ÑÑива (ÑÑо не ÑÑиÑаеÑÑÑ Ð¾Ñибкой). ÐапÑимеÑ, еÑли schedule в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸Ð¼ÐµÐµÑ ÑазмеÑноÑÑи [1:3][1:2], ÑезÑлÑÑаÑом обÑаÑÐµÐ½Ð¸Ñ Ðº schedule[3][3] бÑÐ´ÐµÑ NULL. ÐодобнÑм обÑазом, пÑи обÑаÑении к ÑлеменÑÑ Ð¼Ð°ÑÑива Ñ Ð½ÐµÐ¿ÑавилÑнÑм ÑиÑлом индекÑов возвÑаÑаеÑÑÑ NULL, а не оÑибка.
ÐналогиÑно, NULL возвÑаÑаеÑÑÑ Ð¿Ñи обÑаÑении к ÑÑÐµÐ·Ñ Ð¼Ð°ÑÑива, еÑли Ñам маÑÑив или одно из вÑÑажений, опÑеделÑÑÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑÑ ÑлеменÑов, ÑÐ°Ð²Ð½Ñ NULL. Ðднако в дÑÑÐ³Ð¸Ñ ÑлÑÑаÑÑ , напÑимеÑ, когда гÑаниÑÑ ÑÑеза вÑÑ Ð¾Ð´ÑÑ Ð·Ð° Ñамки маÑÑива, возвÑаÑаеÑÑÑ Ð½Ðµ NULL, а пÑÑÑой маÑÑив (Ñ ÑазмеÑноÑÑÑÑ 0). (Так ÑложилоÑÑ Ð¸ÑÑоÑиÑеÑки, ÑÑо в ÑÑом ÑÑÐµÐ·Ñ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð±ÑаÑений к обÑÑнÑм ÑлеменÑам.) ÐÑли запÑоÑеннÑй ÑÑез пеÑеÑÐµÐºÐ°ÐµÑ Ð³ÑаниÑÑ Ð¼Ð°ÑÑива, Ñогда возвÑаÑаеÑÑÑ Ð½Ðµ NULL, а ÑÑез, ÑокÑаÑÑннÑй до облаÑÑи пеÑеÑеÑениÑ.
ТекÑÑие ÑазмеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива можно полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии array_dims:
SELECT array_dims(schedule) FROM sal_emp WHERE name = 'Carol'; array_dims ------------ [1:2][1:2] (1 row)
array_dims вÑдаÑÑ ÑезÑлÑÑÐ°Ñ Ñипа text, ÑÑо Ñдобно ÑкоÑее Ð´Ð»Ñ Ð»Ñдей, Ñем Ð´Ð»Ñ Ð¿ÑогÑамм. РазмеÑÑ Ð¼Ð°ÑÑива Ñакже можно полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑий array_upper и array_lower, коÑоÑÑе возвÑаÑаÑÑ ÑооÑвеÑÑÑвенно веÑÑ
нÑÑ Ð¸ нижнÑÑ Ð³ÑаниÑÑ Ð´Ð»Ñ Ñказанной ÑазмеÑноÑÑи:
SELECT array_upper(schedule, 1) FROM sal_emp WHERE name = 'Carol';
array_upper
-------------
2
(1 row)array_length возвÑаÑÐ°ÐµÑ ÑиÑло ÑлеменÑов в Ñказанной ÑазмеÑноÑÑи маÑÑива:
SELECT array_length(schedule, 1) FROM sal_emp WHERE name = 'Carol';
array_length
--------------
2
(1 row)cardinality возвÑаÑÐ°ÐµÑ Ð¾Ð±Ñее ÑиÑло ÑлеменÑов маÑÑива по вÑем измеÑениÑм. ФакÑиÑеÑки ÑÑо ÑиÑло ÑÑÑок, коÑоÑое веÑнÑÑ ÑÑнкÑÐ¸Ñ unnest:
SELECT cardinality(schedule) FROM sal_emp WHERE name = 'Carol';
cardinality
-------------
4
(1 row)8.15.4. Ðзменение маÑÑивов #
ÐнаÑение маÑÑива можно замениÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ñак:
UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Carol'; или иÑполÑзÑÑ ÑинÑакÑÐ¸Ñ ARRAY:
UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Carol';Также можно измениÑÑ Ð¾Ð´Ð¸Ð½ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива:
UPDATE sal_emp SET pay_by_quarter[4] = 15000
WHERE name = 'Bill';или ÑÑез:
UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
WHERE name = 'Carol'; ÐÑи ÑÑом в Ñказании ÑÑеза Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑÑена нижнÑÑ-гÑаниÑа и/или веÑÑ
нÑÑ-гÑаниÑа, но ÑолÑко Ð´Ð»Ñ Ð¼Ð°ÑÑива, оÑлиÑного Ð¾Ñ NULL, и имеÑÑего ненÑлевÑÑ ÑазмеÑноÑÑÑ (инаÑе неизвеÑÑно, какие гÑаниÑнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð´ÑÑавлÑÑÑÑÑ Ð²Ð¼ÐµÑÑо опÑÑеннÑÑ
).
СоÑ
ÑанÑннÑй маÑÑив можно ÑаÑÑиÑиÑÑ, опÑеделив знаÑÐµÐ½Ð¸Ñ Ñанее оÑÑÑÑÑÑвовавÑиÑ
в нÑм ÑлеменÑов. ÐÑи ÑÑом вÑе ÑлеменÑÑ, ÑаÑполагаÑÑиеÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑÑÑеÑÑвовавÑими Ñанее и новÑми, пÑинимаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL. ÐапÑимеÑ, еÑли маÑÑив myarray ÑодеÑÐ¶Ð¸Ñ 4 ÑлеменÑа, поÑле пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑлеменÑÑ myarray[6] его длина бÑÐ´ÐµÑ Ñавна 6, а myarray[5] бÑÐ´ÐµÑ ÑодеÑжаÑÑ NULL. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾Ðµ ÑаÑÑиÑение поддеÑживаеÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑÑ
, но не многомеÑнÑÑ
маÑÑивов.
ÐпÑеделÑÑ ÑлеменÑÑ Ð¿Ð¾ индекÑам, можно ÑоздаваÑÑ Ð¼Ð°ÑÑивÑ, в коÑоÑÑÑ
нÑмеÑаÑÐ¸Ñ ÑлеменÑов Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑинаÑÑÑÑ Ð½Ðµ Ñ 1. ÐапÑимеÑ, можно пÑиÑвоиÑÑ Ð·Ð½Ð°Ñение вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ myarray[-2:7] и Ñаким обÑазом ÑоздаÑÑ Ð¼Ð°ÑÑив, в коÑоÑом бÑдÑÑ ÑлеменÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑами Ð¾Ñ -2 до 7.
ÐнаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива Ñакже можно ÑконÑÑÑÑиÑоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа конкаÑенаÑии, ||:
SELECT ARRAY[1,2] || ARRAY[3,4];
?column?
-----------
{1,2,3,4}
(1 row)
SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]];
?column?
---------------------
{{5,6},{1,2},{3,4}}
(1 row)ÐпеÑаÑÐ¾Ñ ÐºÐ¾Ð½ÐºÐ°ÑенаÑии позволÑÐµÑ Ð²ÑÑавиÑÑ Ð¾Ð´Ð¸Ð½ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² наÑало или в ÐºÐ¾Ð½ÐµÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑного маÑÑива. Ðн Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑÑÑ Ð´Ð²Ð° N-меÑнÑÑ
маÑÑива или маÑÑÐ¸Ð²Ñ ÑазмеÑноÑÑей N и N+1.
Ðогда в наÑало или ÐºÐ¾Ð½ÐµÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑного маÑÑива вÑÑавлÑеÑÑÑ Ð¾Ð´Ð¸Ð½ ÑлеменÑ, в обÑазованном в ÑезÑлÑÑаÑе маÑÑиве бÑÐ´ÐµÑ Ñа же нижнÑÑ Ð³ÑаниÑа, ÑÑо и в маÑÑиве-опеÑанде. ÐапÑимеÑ:
SELECT array_dims(1 || '[0:1]={2,3}'::int[]);
array_dims
------------
[0:2]
(1 row)
SELECT array_dims(ARRAY[1,2] || 3);
array_dims
------------
[1:3]
(1 row)Ðогда ÑкладÑваÑÑÑÑ Ð´Ð²Ð° маÑÑива одинаковÑÑ ÑазмеÑноÑÑей, в ÑезÑлÑÑаÑе ÑÐ¾Ñ ÑанÑеÑÑÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð³ÑаниÑа внеÑней ÑазмеÑноÑÑи левого опеÑанда. ÐÑÑ Ð¾Ð´Ð½Ð¾Ð¹ маÑÑив вклÑÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ опеÑанда, поÑле коÑоÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð²Ñе ÑлеменÑÑ Ð¿Ñавого. ÐапÑимеÑ:
SELECT array_dims(ARRAY[1,2] || ARRAY[3,4,5]); array_dims ------------ [1:5] (1 row) SELECT array_dims(ARRAY[[1,2],[3,4]] || ARRAY[[5,6],[7,8],[9,0]]); array_dims ------------ [1:5][1:2] (1 row)
Ðогда к маÑÑÐ¸Ð²Ñ ÑазмеÑноÑÑи N+1 ÑпеÑеди или Ñзади добавлÑеÑÑÑ N-меÑнÑй маÑÑив, он вÑÑавлÑеÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно ÑомÑ, как в маÑÑив вÑÑавлÑеÑÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ (ÑÑо бÑло опиÑано вÑÑе). ÐÑбой N-меÑнÑй маÑÑив по ÑÑÑи ÑвлÑеÑÑÑ ÑлеменÑом во внеÑней ÑазмеÑноÑÑи маÑÑива, имеÑÑего ÑазмеÑноÑÑÑ N+1. ÐапÑимеÑ:
SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]); array_dims ------------ [1:3][1:2] (1 row)
ÐаÑÑив Ñакже можно ÑконÑÑÑÑиÑоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑий array_prepend, array_append и array_cat. ÐеÑвÑе две ÑÑнкÑии поддеÑживаÑÑ ÑолÑко одномеÑнÑе маÑÑивÑ, а array_cat поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸ многомеÑнÑе. ÐеÑколÑко пÑимеÑов:
SELECT array_prepend(1, ARRAY[2,3]);
array_prepend
---------------
{1,2,3}
(1 row)
SELECT array_append(ARRAY[1,2], 3);
array_append
--------------
{1,2,3}
(1 row)
SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);
array_cat
-----------
{1,2,3,4}
(1 row)
SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]);
array_cat
---------------------
{{1,2},{3,4},{5,6}}
(1 row)
SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);
array_cat
---------------------
{{5,6},{1,2},{3,4}}РпÑоÑÑÑÑ ÑлÑÑаÑÑ Ð¾Ð¿Ð¸ÑаннÑй вÑÑе опеÑаÑÐ¾Ñ ÐºÐ¾Ð½ÐºÐ°ÑенаÑии пÑедпоÑÑиÑелÑнее непоÑÑедÑÑвенного вÑзова ÑÑÐ¸Ñ ÑÑнкÑий. Ðднако Ñак как опеÑаÑÐ¾Ñ ÐºÐ¾Ð½ÐºÐ°ÑенаÑии пеÑегÑÑжен Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ ÑÑÑÑ Ð·Ð°Ð´Ð°Ñ, Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑиÑÑаÑии, когда лÑÑÑе пÑимениÑÑ Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÑÐ¸Ñ ÑÑнкÑий во избежание неоднознаÑноÑÑи. ÐапÑимеÑ, ÑаÑÑмоÑÑиÑе:
SELECT ARRAY[1, 2] || '{3, 4}'; -- неÑипизиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока воÑпÑинимаеÑÑÑ ÐºÐ°Ðº маÑÑив
?column?
-----------
{1,2,3,4}
SELECT ARRAY[1, 2] || '7'; -- как и ÑÑа
ERROR: malformed array literal: "7"
SELECT ARRAY[1, 2] || NULL; -- как и бÑквалÑнÑй NULL
?column?
----------
{1,2}
(1 row)
SELECT array_append(ARRAY[1, 2], NULL); -- ÑÑо могло имеÑÑÑÑ Ð² Ð²Ð¸Ð´Ñ Ð½Ð° Ñамом деле
array_append
--------------
{1,2,NULL} РпоказаннÑÑ
пÑимеÑаÑ
анализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа Ð²Ð¸Ð´Ð¸Ñ ÑелоÑиÑленнÑй маÑÑив Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑоÑÐ¾Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа конкаÑенаÑии и конÑÑанÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑнного Ñипа Ñ Ð´ÑÑгой. СоглаÑно Ñвоим пÑавилам ÑазÑеÑÐµÐ½Ð¸Ñ Ñипа конÑÑанÑ, он полагаеÑ, ÑÑо она Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ Ñип, ÑÑо и дÑÑгой опеÑанд â в данном ÑлÑÑае ÑелоÑиÑленнÑй маÑÑив. ÐоÑÑÐ¾Ð¼Ñ Ð¿ÑедполагаеÑÑÑ, ÑÑо опеÑаÑÐ¾Ñ ÐºÐ¾Ð½ÐºÐ°ÑенаÑии здеÑÑ Ð¿ÑедÑÑавлÑÐµÑ ÑÑнкÑÐ¸Ñ array_cat, а не array_append. ÐÑли ÑÑо ÑеÑение оказÑваеÑÑÑ Ð½ÐµÐ²ÐµÑнÑм, его можно ÑкоÑÑекÑиÑоваÑÑ, пÑÐ¸Ð²ÐµÐ´Ñ ÐºÐ¾Ð½ÑÑанÑÑ Ðº ÑÐ¸Ð¿Ñ ÑлеменÑа маÑÑива; однако Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑÑÑе Ñвно иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ array_append.
8.15.5. ÐоиÑк знаÑений в маÑÑÐ¸Ð²Ð°Ñ #
ЧÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи знаÑение в маÑÑиве, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пÑовеÑиÑÑ Ð²Ñе его ÑлеменÑÑ. ÐÑо можно ÑделаÑÑ Ð²ÑÑÑнÑÑ, еÑли Ð²Ñ Ð·Ð½Ð°ÐµÑе ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива. ÐапÑимеÑ:
SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
pay_by_quarter[2] = 10000 OR
pay_by_quarter[3] = 10000 OR
pay_by_quarter[4] = 10000;Ðднако Ñ Ð±Ð¾Ð»ÑÑим маÑÑивами ÑÑÐ¾Ñ Ð¼ÐµÑод ÑÑановиÑÑÑ ÑÑомиÑелÑнÑм, и к ÑÐ¾Ð¼Ñ Ð¶Ðµ он не ÑабоÑаеÑ, когда ÑÐ°Ð·Ð¼ÐµÑ Ð¼Ð°ÑÑива неизвеÑÑен. ÐлÑÑеÑнаÑивнÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ опиÑан в Разделе 9.24. ÐоказаннÑй вÑÑе запÑÐ¾Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло пеÑепиÑаÑÑ Ñак:
SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);
Ð Ñак можно найÑи в ÑаблиÑе ÑÑÑоки, в коÑоÑÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ ÑодеÑÐ¶Ð°Ñ ÑолÑко знаÑениÑ, ÑавнÑе 10000:
SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
ÐÑоме Ñого, Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑам маÑÑива можно иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ generate_subscripts. ÐапÑÐ¸Ð¼ÐµÑ Ñак:
SELECT * FROM
(SELECT pay_by_quarter,
generate_subscripts(pay_by_quarter, 1) AS s
FROM sal_emp) AS foo
WHERE pay_by_quarter[s] = 10000;ÐÑа ÑÑнкÑÐ¸Ñ Ð¾Ð¿Ð¸Ñана в ТаблиÑе 9.67.
Также иÑкаÑÑ Ð² маÑÑиве знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾, иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ &&, коÑоÑÑй пÑовеÑÑеÑ, пеÑекÑÑваеÑÑÑ Ð»Ð¸ левÑй опеÑанд Ñ Ð¿ÑавÑм. ÐапÑимеÑ:
SELECT * FROM sal_emp WHERE pay_by_quarter && ARRAY[10000];
ÐÑÐ¾Ñ Ð¸ дÑÑгие опеÑаÑоÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами опиÑÐ°Ð½Ñ Ð² Разделе 9.19. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑкоÑен Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑего индекÑа, как опиÑано в Разделе 11.2.
ÐÑ Ñакже можеÑе иÑкаÑÑ Ð¾Ð¿ÑеделÑннÑе знаÑÐµÐ½Ð¸Ñ Ð² маÑÑиве, иÑполÑзÑÑ ÑÑнкÑии array_position и array_positions. ÐеÑÐ²Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð¿ÐµÑвого вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² маÑÑив, а вÑоÑÐ°Ñ â маÑÑив позиÑий вÑеÑ
его вÑ
ождений. ÐапÑимеÑ:
SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');
array_position
----------------
2
(1 row)
SELECT array_positions(ARRAY[1, 4, 3, 1, 3, 4, 2, 1], 1);
array_positions
-----------------
{1,4,8}
(1 row)ÐодÑказка
ÐаÑÑÐ¸Ð²Ñ â ÑÑо не множеÑÑва; Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð¿Ð¾Ð¸Ñка опÑеделÑннÑÑ ÑлеменÑов в маÑÑиве Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ñизнаком неÑдаÑно ÑконÑÑÑÑиÑованной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Ðозможно, вмеÑÑо маÑÑива лÑÑÑе иÑполÑзоваÑÑ Ð¾ÑделÑнÑÑ ÑаблиÑÑ, ÑÑÑоки коÑоÑой бÑдÑÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе ÑлеменÑов маÑÑива. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑÑÑе и Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, и Ð´Ð»Ñ ÑабоÑÑ Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом ÑлеменÑов.
8.15.6. СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ вÑводимÑÑ Ð·Ð½Ð°Ñений маÑÑива #
ÐнеÑнее ÑекÑÑовое пÑедÑÑавление знаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· запиÑи ÑлеменÑов, инÑеÑпÑеÑиÑÑемÑÑ
по пÑавилам ввода-вÑвода Ð´Ð»Ñ Ñипа ÑлеменÑа маÑÑива, и оÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ ÑÑÑÑкÑÑÑÑ Ð¼Ð°ÑÑива. ÐÑоÑмление ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑигÑÑнÑÑ
Ñкобок ({ и }), окÑÑжаÑÑиÑ
знаÑение маÑÑива, и знаков-ÑазделиÑелей Ð¼ÐµÐ¶Ð´Ñ ÐµÐ³Ð¾ ÑлеменÑами. РкаÑеÑÑве знака-ÑазделиÑÐµÐ»Ñ Ð¾Ð±ÑÑно иÑполÑзÑеÑÑÑ Ð·Ð°Ð¿ÑÑÐ°Ñ (,), но ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ дÑÑгой Ñимвол; он опÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑом typdelim Ð´Ð»Ñ Ñипа ÑлеменÑа маÑÑива. ÐÐ»Ñ ÑÑандаÑÑнÑÑ
Ñипов даннÑÑ
, ÑÑÑеÑÑвÑÑÑиÑ
в диÑÑÑибÑÑиве Postgres Pro, ÑазделиÑелем ÑвлÑеÑÑÑ Ð·Ð°Ð¿ÑÑÐ°Ñ (,), за иÑклÑÑением лиÑÑ Ñипа box, в коÑоÑом ÑазделиÑÐµÐ»Ñ â ÑоÑка Ñ Ð·Ð°Ð¿ÑÑой (;). РмногомеÑном маÑÑиве Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑазмеÑноÑÑи (ÑÑд, плоÑкоÑÑÑ, кÑб и Ñ. д.) еÑÑÑ Ñвой ÑÑÐ¾Ð²ÐµÐ½Ñ ÑигÑÑнÑÑ
Ñкобок, а ÑоÑедние знаÑÐµÐ½Ð¸Ñ Ð² ÑигÑÑнÑÑ
ÑкобкаÑ
на одном ÑÑовне Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑделÑÑÑÑÑ ÑазделиÑелÑми.
ФÑнкÑÐ¸Ñ Ð²Ñвода маÑÑива заклÑÑÐ°ÐµÑ Ð·Ð½Ð°Ñение ÑлеменÑа в кавÑÑки, еÑли ÑÑо пÑÑÑÐ°Ñ ÑÑÑока или оно ÑодеÑÐ¶Ð¸Ñ ÑигÑÑнÑе Ñкобки, знаки-ÑазделиÑели, кавÑÑки, обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ, пÑобелÑнÑй Ñимвол или ÑÑо ÑекÑÑ NULL. ÐавÑÑки и обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа, вклÑÑÑннÑе в Ñакие знаÑениÑ, пÑеобÑазÑÑÑÑÑ Ð² ÑпеÑпоÑледоваÑелÑноÑÑÑ Ñ Ð¾Ð±ÑаÑной коÑой ÑеÑÑой. ÐÐ»Ñ ÑиÑловÑÑ
Ñипов даннÑÑ
можно ÑаÑÑÑиÑÑваÑÑ Ð½Ð° Ñо, ÑÑо знаÑÐµÐ½Ð¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не бÑдÑÑ Ð²ÑводиÑÑÑÑ Ð² кавÑÑкаÑ
, но Ð´Ð»Ñ ÑекÑÑовÑÑ
Ñипов ÑледÑÐµÑ Ð±ÑÑÑ Ð³Ð¾ÑовÑм к ÑомÑ, ÑÑо вÑводимое знаÑение маÑÑива Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÐºÐ°Ð²ÑÑки.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ð½ÑÑ Ð³ÑаниÑа вÑеÑ
ÑазмеÑноÑÑей маÑÑива Ñавна одномÑ. ЧÑÐ¾Ð±Ñ Ð¿ÑедÑÑавиÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ Ñ Ð´ÑÑгими нижними гÑаниÑами, пеÑед ÑодеÑжимÑм маÑÑива можно ÑказаÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð¸Ð½Ð´ÐµÐºÑов. Такое оÑоÑмление маÑÑива бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÐºÐ²Ð°Ð´ÑаÑнÑе Ñкобки ([]) вокÑÑг нижней и веÑÑ
ней гÑÐ°Ð½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑазмеÑноÑÑи Ñ Ð´Ð²Ð¾ÐµÑоÑием (:) Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸. Ðа Ñаким Ñказанием ÑазмеÑноÑÑи ÑледÑÐµÑ Ð·Ð½Ð°Ðº Ñавно (=). ÐапÑимеÑ:
SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
FROM (SELECT '[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[] AS f1) AS ss;
e1 | e2
----+----
1 | 6
(1 row)ÐÑоÑедÑÑа вÑвода маÑÑива вклÑÑÐ°ÐµÑ Ð² ÑезÑлÑÑÐ°Ñ Ñвное Ñказание ÑазмеÑноÑÑей, ÑолÑко еÑли нижнÑÑ Ð³ÑаниÑа в одной или неÑколÑÐºÐ¸Ñ ÑазмеÑноÑÑÑÑ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ 1.
ÐÑли в каÑеÑÑве знаÑÐµÐ½Ð¸Ñ ÑлеменÑа задаÑÑÑÑ NULL (в лÑбом ÑегиÑÑÑе), ÑÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑÑиÑаеÑÑÑ ÑавнÑм непоÑÑедÑÑвенно NULL. ÐÑли же оно вклÑÑÐ°ÐµÑ ÐºÐ°Ð²ÑÑки или обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ, ÑлеменÑÑ Ð¿ÑиÑваиваеÑÑÑ ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока «NULL». ÐÑоме Ñого, Ð´Ð»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи Ñ Ð²ÐµÑÑиÑми PostgreSQL до 8.2, паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии array_nulls можно вÑклÑÑиÑÑ (пÑиÑвоив ÐµÐ¼Ñ off), ÑÑÐ¾Ð±Ñ ÑÑÑоки NULL не воÑпÑинималиÑÑ ÐºÐ°Ðº знаÑÐµÐ½Ð¸Ñ NULL.
Ðак бÑло показано Ñанее, запиÑÑÐ²Ð°Ñ Ð·Ð½Ð°Ñение маÑÑива, лÑбой его ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ заклÑÑиÑÑ Ð² кавÑÑки. ÐÑо нÑжно делаÑÑ, еÑли пÑи ÑазбоÑе знаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива без кавÑÑек возможна неоднознаÑноÑÑÑ. ÐапÑимеÑ, в кавÑÑки необÑ
одимо заклÑÑаÑÑ ÑлеменÑÑ, ÑодеÑжаÑие ÑигÑÑнÑе Ñкобки, запÑÑÑÑ (или ÑазделиÑелÑ, опÑеделÑннÑй Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñипа), кавÑÑки, обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ, а Ñакже пÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² наÑале или конÑе ÑÑÑоки. ÐÑÑÑÑе ÑÑÑоки и ÑÑÑоки, ÑодеÑжаÑие одно Ñлово NULL, Ñакже нÑжно заклÑÑаÑÑ Ð² кавÑÑки. ЧÑÐ¾Ð±Ñ Ð²ÐºÐ»ÑÑиÑÑ ÐºÐ°Ð²ÑÑки или обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð² знаÑение, заклÑÑÑнное в кавÑÑки, добавÑÑе обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð¿ÐµÑед Ñаким Ñимволом. С дÑÑгой ÑÑоÑонÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð¹ÑиÑÑ Ð±ÐµÐ· кавÑÑек, Ñаким ÑкÑаниÑованием можно заÑиÑиÑÑ Ð²Ñе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² даннÑÑ
, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð²Ð¾ÑпÑинÑÑÑ ÐºÐ°Ðº ÑаÑÑÑ ÑинÑакÑиÑа маÑÑива.
ÐеÑед оÑкÑÑваÑÑей и поÑле закÑÑваÑÑей Ñкобки можно добавлÑÑÑ Ð¿ÑобелÑнÑе ÑимволÑ. ÐÑÐ¾Ð±ÐµÐ»Ñ Ñакже могÑÑ Ð¾ÐºÑÑжаÑÑ ÐºÐ°Ð¶Ð´ÑÑ Ð¾ÑделÑнÑÑ ÑÑÑÐ¾ÐºÑ Ð·Ð½Ð°ÑениÑ. Ðо вÑÐµÑ ÑлÑÑаÑÑ Ñакие пÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ. Ðднако вÑе пÑÐ¾Ð±ÐµÐ»Ñ Ð² ÑÑÑÐ¾ÐºÐ°Ñ , заклÑÑÑннÑÑ Ð² кавÑÑки, или окÑÑжÑннÑе не пÑобелÑнÑми Ñимволами, напÑоÑив, ÑÑиÑÑваÑÑÑÑ.
ÐодÑказка
ÐапиÑÑваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑивов в командаÑ
SQL ÑаÑÑо бÑÐ²Ð°ÐµÑ Ñдобнее Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа ARRAY (Ñм. ÐодÑаздел 4.2.12). Ð ARRAY оÑделÑнÑе знаÑÐµÐ½Ð¸Ñ ÑлеменÑов запиÑÑваÑÑÑÑ Ñак же, как еÑли Ð±Ñ Ð¾Ð½Ð¸ не бÑли Ñленами маÑÑива.