PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 8. �������� | Fast Forward | Next |
PostgreSQL �����¼���ֶζ���ɶ��������Ķ�ά���顣 �������Ϳ������κλ������ͻ��û��������͡����������������ͺ�������黹��֧�֡���
Ϊ˵����Щ�÷��������ȴ���һ���ɻ����������鹹�ɵı�
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 ����ǿ������ߴ����ơ�
��һ��������ֵд��һ���ı�ֵ��ʱ�� �����û���������ֵ�����������ö��Ž����Ƿֿ��� ������㶮 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 ���и���ϸ�����ۡ�
�������ǿ����������������һЩ��ѯ�� ���ȣ�������ʾ���һ�η��������һ��Ԫ�ء� �����ѯ�����ڵڶ�����нˮ�仯�Ĺ�Ա����
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)
һ������ֵ������ȫ�����棺
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}}
Ҫ����һ�������е���ֵ���������������ÿһ��ֵ�� ������ֹ����������֪������ߴ磩�����磺
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��Ӵ��ʱ��Ҳ���Ը��õ���չ��
һ������ֵ���ⲿ������ʽ��һЩ���ݸ�����Ԫ�����͵� 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 �������Ԫ��ֵ��д����������û��Ԫ��ʱ��д��һ����