8.10. ����

PostgreSQL �����¼���ֶζ���ɶ����򲻶����Ķ�ά���顣 �������Ϳ������κλ������ͻ��û��������͡����������������ͺ�������黹��֧�֡���

8.10.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 �ﶨ�����ֻ���ά����ֻ�Ǽ򵥵��ĵ���������Ӱ������ʱ����Ϊ��

���⻹��һ���﷨������ѭ SQL: 1999 ��׼��������������һά���顣 pay_by_quarter ���Զ���Ϊ��

    pay_by_quarter  integer ARRAY[4],

����﷨Ҫ��һ������������ʾ����ߴ硣����������ǰһ����PostgreSQL ����ǿ������ߴ����ơ�

8.10.2. ����ֵ����

��һ��������ֵд��һ���ı�ֵ��ʱ�� �����û���������ֵ�����������ö��Ž����Ƿֿ��� ������㶮 C����ô�����ʼ��һ���ṹ���񡣣� ��������κ�����ֵ��Χ����˫���ţ�������ֵ�������Ż��߻������� ��ô��ͱ������˫���š��������и���ϸ�ڡ�����ˣ�һ�����鳣���ij�����ʽ���£�

'{ val1 delim val2 delim ... }'

����� delim �Ǹ����͵ķָ����� �����Ǹ������� pg_type ��¼��ָ�����Ǹ��� �� PostgreSQL �����ṩ�ı�׼��������� ���� box ʹ�÷ֺţ�;�������������������Ͷ��ö��ţ�,���� ÿ�� val Ҫô��һ������Ԫ�����͵ij�����Ҫô��һ�������顣һ�����鳣����������

'{{1,2,3},{4,5,6},{7,8,9}}'

���������һ����ά�ģ�3��3�����飬������������������ɡ�

���������鳣��ʵ����ֻ�������� Section 4.1.2.5 �����۹���һ�����ͳ�����һ����������������ǵ����ִ��������Ҵ��ݸ���������ת�����̡�������Ҫ��������ȷ��������������

�������ǿ�����ʾһЩ INSERT ��䡣

INSERT INTO sal_emp
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {"meeting"}}');
ERROR:  multidimensional arrays must have array expressions with matching dimensions

��ע���ά�������ƥ��ÿ��ά��Ԫ�����������ƥ�����´�������

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"}}');

Ŀǰ������ʵ�ֵ�һ��������һ������Ķ���Ԫ�ز����� SQL ��ֵ�� ���������������Ϊ�գ������㲻������ôһ�����飬������ЩԪ���ǿգ� ����Щ���ǡ�

ǰ�����������Ľ����������������

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)

���ǻ�����ʹ�� 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 �������﷨�� Section 4.2.10 ���и���ϸ�����ۡ�

8.10.3. ��������

�������ǿ����������������һЩ��ѯ�� ���ȣ�������ʾ���һ�η��������һ��Ԫ�ء� �����ѯ�����ڵڶ�����нˮ�仯�Ĺ�Ա����

SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];

 name
-------
 Carol
(1 row)

����Ľű�������д�ڷ������ڵġ� PostgreSQL ȱʡʹ����һΪ��������ϰ�ߣ� Ҳ����˵��һ�� n Ԫ�ص������array[1]��ʼ�� �� array[n] ������

�����ѯ�������й�Ա�������ȵ�нˮ��

SELECT pay_by_quarter[3] FROM sal_emp;

 pay_by_quarter
----------------
          10000
          25000
(2 rows)

���ǻ����Է���һ����������ⳤ����Ƭ�ϣ���������顣 ����һά�����ά���飬һ�������ijһ�������� �ű��½��� �ű��Ͻ� ��ʾ�ġ� ���磬�����ѯ���� Bill ����ͷ����ĵ�һ���ƻ���

SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';

        schedule
------------------------
 {{meeting},{training}}
(1 row)

���ǻ���������д

SELECT schedule[1:2][1] FROM sal_emp WHERE name = 'Bill';

��ȡͬ���Ľ��������κνű�д�� lower�� upper ����ʽ����ô�κ�����ű�������ǵ���һ������Ƭ�϶Դ��� ���ֻ������һ����ֵ����ô���Ǽ����½�Ϊ 1�����磺

SELECT schedule[1:2][2] FROM sal_emp WHERE name = 'Bill';

                 schedule
-------------------------------------------
 {{meeting,lunch},{training,presentation}}
(1 row)

�κ�����ĵ�ǰά���������� array_dims ����������

SELECT array_dims(schedule) FROM sal_emp WHERE name = 'Carol';

 array_dims
------------
 [1:2][1:1]
(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)

8.10.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';

����ֻ�Ǹ���ijһ��Ԫ�أ�

UPDATE sal_emp SET pay_by_quarter[4] = 15000
    WHERE name = 'Bill';

���߸���ij��Ƭ�ϣ�

UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
    WHERE name = 'Carol';

���ǿ���ͨ����һ�����Ѵ��ڵ�Ԫ������Ԫ�ظ�ֵ�ķ����� ���������Ѵ��ڵ��������ڻ��ص�������ֵ�ķ���������һ�����顣 ���磬���һ������ myarray ��ǰ�� 4 ��Ԫ�أ���ô������Ǹ� myarray[5] ��ֵ�����������Ԫ�ء�Ŀǰ������������ֻ�����һά������У� ���ܶԶ�ά������в�����

����Ƭ�θ�ֵ��������ʹ��һΪ�����±�����顣 ���磬���ǿ��Ը� array[-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 || ARRAY[2,3]);
 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 ά������ѹ��һ�� N+1 ά����Ŀ�ͷ���߽�β�� ��������������Ԫ�ص�������ơ�ÿ�� N ά��������ʵ���϶��� N+1 ά��������ά�������磺

SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]);
 array_dims
------------
 [0:2][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}}

8.10.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;

���������ڴ�������ԣ���������ܿ�ͻ����˾������ģ���������㲻֪������ߴ磬�Ǿ�ûʲô���ˡ� ����һ�������� Section 9.17 �������� ����IJ�ѯ����������Ĵ��棺

SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);

���⣬����������������ҳ�����������ֵ���� 10000 ���У�

SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);

��ʾ: ���鲻�Ǽ��ϣ�������ǰ����Щ����������������ʹ������ͨ��������Ŀ���������⡣ �����ֶ�ͨ���ǿ��Է��ѳɶ����ı� �����Ա�Ҫ���������öࡣ������Ԫ����Ŀ�dz��Ӵ��ʱ��Ҳ���Ը��õ���չ��

8.10.6. �������������﷨

һ������ֵ���ⲿ������ʽ��һЩ���ݸ�����Ԫ�����͵� I/O ת���������������ɣ� �ټ���һЩ����������ṹ�����Ρ� ��Щ������Χ��������ֵ��Χ�Ļ�������{ �� }���� ����������֮��ķָ��ַ���ɡ��ָ��ַ�ͨ����һ�����ţ�,���� ��Ҳ�����������Ķ��������ɸ�����Ԫ�����͵� typdelim ���þ����� ���� PostgreSQL �汾�ṩ�ı�׼��������� ���� box ʹ�÷ֺţ�;��������������������ʹ�ö��š��� �ڶ�ά�����ÿ��ά���У��棬�壬�ȣ����Լ�����Ļ�������������ͬ�����ٵĻ�������֮�����д�ָ�����

�������Ԫ��ֵ�ǿ��ִ����߰������������ָ�����˫���ţ���б�ܻ��߿հף� ��ô����������̽�����Щֵ��Χ��Χ˫���š���Ԫ��ֵ�������˫���źͷ�б�ܽ�����б�����ݡ� ������ֵ�������ͣ�����԰�ȫ�ؼ�����ֵû��˫���Ű�Χ�����Ƕ����ı����ͣ����Ǿ���Ҫ׼���������˫���Ű�Χ�� ��û��˫���Ű�Χ��������ˡ������Ƕ� 7.2 ��ǰ�� PostgreSQL �汾����Ϊ��һ���ı䡣��

ȱʡʱ��һ�������ijά���±�����������Ϊһ�ġ����һ�������ijά���±겻����һ�� ��ô�ͻ�������ṹ�������������һ��ʵ�ʵ�ά������������ɷ�������[]�� Χ����ÿ������ά���½���Ͻ��������м���һ��ð�ţ�:���ָ����ִ���ɡ� ����ά�����κ������һ���ȺŲ�������=�������磺

SELECT 1 || ARRAY[2,3] AS array;

     array
---------------
 [0:2]={1,2,3}
(1 row)

SELECT ARRAY[1,2] || ARRAY[[3,4]] AS array;

          array
--------------------------
 [0:1][1:2]={{1,2},{3,4}}
(1 row)

����﷨Ҳ����������һ�������ı���������ȱʡ����űꡣ���磺

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)

��������������дһ���������ֵ��ʱ����Ҫ��˫���Ű�Χ�������������Ԫ�ء� ���Ԫ����ֵ������������ֵ�������������壬��ô��������ô���� ���磬��Щ���������������ţ������κ������ķָ��ַ����� ˫���ţ���б�ܣ�����ǰ���Ŀհ�Ԫ�ض������˫���š� Ҫ��˫���Ż��߷�б�ܷŵ�����Ԫ��ֵ������Ǽ�һ����б��ǰ׺�� ���⣬������÷�б�����ݵķ�������������Щ���ܱ����������﷨���ַ���

�������������ǰ������һ���������д�հס��㻹������������������ִ�ǰ����ߺ���д�հס� ������Щ����£���Щ�հ׶��ᱻ���ԡ���������˫���Ű�Χ��Ԫ������Ŀհף�������Ԫ���ﱻ���߷ǿհ��ַ���Χ�Ŀհף������ᱻ���ԡ�

ע��: ���ס���� SQL ������д���κζ����������Ƚ��ͳ�һ���ִ��ı��� Ȼ�����һ�����顣���������������Ҫ�ķ�б���������˷��� ���磬Ҫ����һ��������б�ܺ�˫���ŵ� text ���飬 ����Ҫ��ôд

INSERT ... VALUES ('{"\\\\","\\""}');

�ִ��ı�������ȥ����һ�㷴б�ܣ�Ȼ��ʡ�µĶ�������������ֵ��������ʱ�������� {"\\","\""}�� ���ţ����ִ����ݸ� text �������͵�������̣��ֱ��� \ �� "�� ����������õ��������ͶԷ�б��Ҳ��������������� bytea�� ��ô���ǿ�����Ҫ��������Ŷ��˸���б�ܲ����ڴ洢̬������Ԫ���еõ�һ����б�ܡ��� ����Ҳ��������Ԫ����Χ������ Section 4.1.2.2��������˫�ݵķ�б�ܡ�

��ʾ: ARRAY �������﷨������ Section 4.2.10��ͨ���������ı��﷨����Щ���������� SQL ������д����ֵ��ʱ�� �� ARRAY �������Ԫ��ֵ��д����������û��Ԫ��ʱ��д��һ����