]> granicus.if.org Git - postgresql/blob - doc/src/sgml/array.sgml
Since SQL:2003, the array size specification in the SQL ARRAY syntax has
[postgresql] / doc / src / sgml / array.sgml
1 <!-- $PostgreSQL: pgsql/doc/src/sgml/array.sgml,v 1.67 2008/10/29 11:24:52 petere Exp $ -->
2
3 <sect1 id="arrays">
4  <title>Arrays</title>
5
6  <indexterm>
7   <primary>array</primary>
8  </indexterm>
9
10  <para>
11   <productname>PostgreSQL</productname> allows columns of a table to be
12   defined as variable-length multidimensional arrays. Arrays of any
13   built-in or user-defined base type, enum type, or composite type
14   can be created.
15   Arrays of domains are not yet supported.
16  </para>
17
18  <sect2 id="arrays-declaration">
19   <title>Declaration of Array Types</title>
20
21   <indexterm>
22    <primary>array</primary>
23    <secondary>declaration</secondary>
24   </indexterm>
25
26  <para>
27   To illustrate the use of array types, we create this table:
28 <programlisting>
29 CREATE TABLE sal_emp (
30     name            text,
31     pay_by_quarter  integer[],
32     schedule        text[][]
33 );
34 </programlisting>
35   As shown, an array data type is named by appending square brackets
36   (<literal>[]</>) to the data type name of the array elements.  The
37   above command will create a table named
38   <structname>sal_emp</structname> with a column of type
39   <type>text</type> (<structfield>name</structfield>), a
40   one-dimensional array of type <type>integer</type>
41   (<structfield>pay_by_quarter</structfield>), which represents the
42   employee's salary by quarter, and a two-dimensional array of
43   <type>text</type> (<structfield>schedule</structfield>), which
44   represents the employee's weekly schedule.
45  </para>
46
47  <para>
48   The syntax for <command>CREATE TABLE</command> allows the exact size of
49   arrays to be specified, for example:
50
51 <programlisting>
52 CREATE TABLE tictactoe (
53     squares   integer[3][3]
54 );
55 </programlisting>
56
57   However, the current implementation does not enforce the array size
58   limits &mdash; the behavior is the same as for arrays of unspecified
59   length.
60  </para>
61
62  <para>
63   Actually, the current implementation does not enforce the declared
64   number of dimensions either.  Arrays of a particular element type are
65   all considered to be of the same type, regardless of size or number
66   of dimensions.  So, declaring number of dimensions or sizes in
67   <command>CREATE TABLE</command> is simply documentation, it does not
68   affect run-time behavior.
69  </para>
70
71  <para>
72   An alternative syntax, which conforms to the SQL standard, can
73   be used for one-dimensional arrays.
74   <structfield>pay_by_quarter</structfield> could have been defined
75   as:
76 <programlisting>
77     pay_by_quarter  integer ARRAY[4],
78 </programlisting>
79   Or, if no array size is to be specified:
80 <programlisting>
81     pay_by_quarter  integer ARRAY,
82 </programlisting>
83   As before, however, <productname>PostgreSQL</> does not enforce the
84   size restriction in any case.
85  </para>
86  </sect2>
87
88  <sect2 id="arrays-input">
89   <title>Array Value Input</title>
90
91   <indexterm>
92    <primary>array</primary>
93    <secondary>constant</secondary>
94   </indexterm>
95
96   <para>
97    To write an array value as a literal constant, enclose the element
98    values within curly braces and separate them by commas.  (If you
99    know C, this is not unlike the C syntax for initializing
100    structures.)  You can put double quotes around any element value,
101    and must do so if it contains commas or curly braces.  (More
102    details appear below.)  Thus, the general format of an array
103    constant is the following:
104 <synopsis>
105 '{ <replaceable>val1</replaceable> <replaceable>delim</replaceable> <replaceable>val2</replaceable> <replaceable>delim</replaceable> ... }'
106 </synopsis>
107    where <replaceable>delim</replaceable> is the delimiter character
108    for the type, as recorded in its <literal>pg_type</literal> entry.
109    Among the standard data types provided in the
110    <productname>PostgreSQL</productname> distribution, type
111    <literal>box</> uses a semicolon (<literal>;</>) but all the others
112    use comma (<literal>,</>). Each <replaceable>val</replaceable> is
113    either a constant of the array element type, or a subarray. An example
114    of an array constant is:
115 <programlisting>
116 '{{1,2,3},{4,5,6},{7,8,9}}'
117 </programlisting>
118    This constant is a two-dimensional, 3-by-3 array consisting of
119    three subarrays of integers.
120   </para>
121
122   <para>
123    To set an element of an array constant to NULL, write <literal>NULL</>
124    for the element value.  (Any upper- or lower-case variant of
125    <literal>NULL</> will do.)  If you want an actual string value
126    <quote>NULL</>, you must put double quotes around it.
127   </para>
128
129   <para>
130    (These kinds of array constants are actually only a special case of
131    the generic type constants discussed in <xref
132    linkend="sql-syntax-constants-generic">.  The constant is initially
133    treated as a string and passed to the array input conversion
134    routine.  An explicit type specification might be necessary.)
135   </para>
136
137   <para>
138    Now we can show some <command>INSERT</command> statements:
139
140 <programlisting>
141 INSERT INTO sal_emp
142     VALUES ('Bill',
143     '{10000, 10000, 10000, 10000}',
144     '{{"meeting", "lunch"}, {"training", "presentation"}}');
145
146 INSERT INTO sal_emp
147     VALUES ('Carol',
148     '{20000, 25000, 25000, 25000}',
149     '{{"breakfast", "consulting"}, {"meeting", "lunch"}}');
150 </programlisting>
151   </para>
152
153  <para>
154   The result of the previous two inserts looks like this:
155
156 <programlisting>
157 SELECT * FROM sal_emp;
158  name  |      pay_by_quarter       |                 schedule
159 -------+---------------------------+-------------------------------------------
160  Bill  | {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}
161  Carol | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}
162 (2 rows)
163 </programlisting>
164  </para>
165
166  <para>
167   The <literal>ARRAY</> constructor syntax can also be used:
168 <programlisting>
169 INSERT INTO sal_emp
170     VALUES ('Bill',
171     ARRAY[10000, 10000, 10000, 10000],
172     ARRAY[['meeting', 'lunch'], ['training', 'presentation']]);
173
174 INSERT INTO sal_emp
175     VALUES ('Carol',
176     ARRAY[20000, 25000, 25000, 25000],
177     ARRAY[['breakfast', 'consulting'], ['meeting', 'lunch']]);
178 </programlisting>
179   Notice that the array elements are ordinary SQL constants or
180   expressions; for instance, string literals are single quoted, instead of
181   double quoted as they would be in an array literal.  The <literal>ARRAY</>
182   constructor syntax is discussed in more detail in
183   <xref linkend="sql-syntax-array-constructors">.
184  </para>
185
186  <para>
187   Multidimensional arrays must have matching extents for each
188   dimension. A mismatch causes an error report, for example:
189
190 <programlisting>
191 INSERT INTO sal_emp
192     VALUES ('Bill',
193     '{10000, 10000, 10000, 10000}',
194     '{{"meeting", "lunch"}, {"meeting"}}');
195 ERROR:  multidimensional arrays must have array expressions with matching dimensions
196 </programlisting>
197  </para>
198  </sect2>
199
200  <sect2 id="arrays-accessing">
201   <title>Accessing Arrays</title>
202
203   <indexterm>
204    <primary>array</primary>
205    <secondary>accessing</secondary>
206   </indexterm>
207
208  <para>
209   Now, we can run some queries on the table.
210   First, we show how to access a single element of an array at a time.
211   This query retrieves the names of the employees whose pay changed in
212   the second quarter:
213      
214 <programlisting>
215 SELECT name FROM sal_emp WHERE pay_by_quarter[1] &lt;&gt; pay_by_quarter[2];
216
217  name
218 -------
219  Carol
220 (1 row)
221 </programlisting>
222
223   The array subscript numbers are written within square brackets.
224   By default <productname>PostgreSQL</productname> uses the
225   one-based numbering convention for arrays, that is,
226   an array of <replaceable>n</> elements starts with <literal>array[1]</literal> and
227   ends with <literal>array[<replaceable>n</>]</literal>.
228  </para>
229
230  <para>
231   This query retrieves the third quarter pay of all employees:
232      
233 <programlisting>
234 SELECT pay_by_quarter[3] FROM sal_emp;
235
236  pay_by_quarter
237 ----------------
238           10000
239           25000
240 (2 rows)
241 </programlisting>
242  </para>
243
244  <para>
245   We can also access arbitrary rectangular slices of an array, or
246   subarrays.  An array slice is denoted by writing
247   <literal><replaceable>lower-bound</replaceable>:<replaceable>upper-bound</replaceable></literal>
248   for one or more array dimensions.  For example, this query retrieves the first
249   item on Bill's schedule for the first two days of the week:
250      
251 <programlisting>
252 SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
253
254         schedule
255 ------------------------
256  {{meeting},{training}}
257 (1 row)
258 </programlisting>
259
260   If any dimension is written as a slice, i.e. contains a colon, then all
261   dimensions are treated as slices.  Any dimension that has only a single
262   number (no colon) is treated as being from <literal>1</>
263   to the number specified.  For example, <literal>[2]</> is treated as
264   <literal>[1:2]</>, as in this example:
265
266 <programlisting>
267 SELECT schedule[1:2][2] FROM sal_emp WHERE name = 'Bill';
268
269                  schedule
270 -------------------------------------------
271  {{meeting,lunch},{training,presentation}}
272 (1 row)
273 </programlisting>
274
275   To avoid confusion with the non-slice case, it's best to use slice syntax
276   for all dimensions, e.g., <literal>[1:2][1:1]</>, not <literal>[2][1:1]</>.
277  </para>
278
279  <para>
280   An array subscript expression will return null if either the array itself or
281   any of the subscript expressions are null.  Also, null is returned if a
282   subscript is outside the array bounds (this case does not raise an error).
283   For example, if <literal>schedule</>
284   currently has the dimensions <literal>[1:3][1:2]</> then referencing
285   <literal>schedule[3][3]</> yields NULL.  Similarly, an array reference
286   with the wrong number of subscripts yields a null rather than an error.
287  </para>
288
289  <para>
290   An array slice expression likewise yields null if the array itself or
291   any of the subscript expressions are null.  However, in other corner
292   cases such as selecting an array slice that
293   is completely outside the current array bounds, a slice expression
294   yields an empty (zero-dimensional) array instead of null.  (This
295   does not match non-slice behavior and is done for historical reasons.)
296   If the requested slice partially overlaps the array bounds, then it
297   is silently reduced to just the overlapping region.
298  </para>
299
300  <para>
301   The current dimensions of any array value can be retrieved with the
302   <function>array_dims</function> function:
303
304 <programlisting>
305 SELECT array_dims(schedule) FROM sal_emp WHERE name = 'Carol';
306
307  array_dims
308 ------------
309  [1:2][1:2]
310 (1 row)
311 </programlisting>
312
313   <function>array_dims</function> produces a <type>text</type> result,
314   which is convenient for people to read but perhaps not so convenient
315   for programs.  Dimensions can also be retrieved with
316   <function>array_upper</function> and <function>array_lower</function>,
317   which return the upper and lower bound of a
318   specified array dimension, respectively:
319
320 <programlisting>
321 SELECT array_upper(schedule, 1) FROM sal_emp WHERE name = 'Carol';
322
323  array_upper
324 -------------
325            2
326 (1 row)
327 </programlisting>
328  </para>
329  </sect2>
330
331  <sect2 id="arrays-modifying">
332   <title>Modifying Arrays</title>
333
334   <indexterm>
335    <primary>array</primary>
336    <secondary>modifying</secondary>
337   </indexterm>
338
339  <para>
340   An array value can be replaced completely:
341
342 <programlisting>
343 UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
344     WHERE name = 'Carol';
345 </programlisting>
346
347   or using the <literal>ARRAY</literal> expression syntax:
348
349 <programlisting>
350 UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
351     WHERE name = 'Carol';
352 </programlisting>
353
354   An array can also be updated at a single element:
355
356 <programlisting>
357 UPDATE sal_emp SET pay_by_quarter[4] = 15000
358     WHERE name = 'Bill';
359 </programListing>
360
361   or updated in a slice:
362
363 <programlisting>
364 UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
365     WHERE name = 'Carol';
366 </programlisting>
367
368  </para>
369
370  <para>
371   A stored array value can be enlarged by assigning to element(s) not already
372   present.  Any positions between those previously present and the newly
373   assigned element(s) will be filled with nulls.  For example, if array
374   <literal>myarray</> currently has 4 elements, it will have six
375   elements after an update that assigns to <literal>myarray[6]</>,
376   and <literal>myarray[5]</> will contain a null.
377   Currently, enlargement in this fashion is only allowed for one-dimensional
378   arrays, not multidimensional arrays.
379  </para>
380
381  <para>
382   Subscripted assignment allows creation of arrays that do not use one-based
383   subscripts.  For example one might assign to <literal>myarray[-2:7]</> to
384   create an array with subscript values running from -2 to 7.
385  </para>
386
387  <para>
388   New array values can also be constructed by using the concatenation operator,
389   <literal>||</literal>:
390 <programlisting>
391 SELECT ARRAY[1,2] || ARRAY[3,4];
392  ?column?
393 -----------
394  {1,2,3,4}
395 (1 row)
396
397 SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]];
398       ?column?
399 ---------------------
400  {{5,6},{1,2},{3,4}}
401 (1 row)
402 </programlisting>
403  </para>
404
405  <para>
406   The concatenation operator allows a single element to be pushed on to the
407   beginning or end of a one-dimensional array. It also accepts two
408   <replaceable>N</>-dimensional arrays, or an <replaceable>N</>-dimensional
409   and an <replaceable>N+1</>-dimensional array.
410  </para>
411
412  <para>
413   When a single element is pushed on to either the beginning or end of a
414   one-dimensional array, the result is an array with the same lower bound
415   subscript as the array operand. For example:
416 <programlisting>
417 SELECT array_dims(1 || '[0:1]={2,3}'::int[]);
418  array_dims
419 ------------
420  [0:2]
421 (1 row)
422
423 SELECT array_dims(ARRAY[1,2] || 3);
424  array_dims
425 ------------
426  [1:3]
427 (1 row)
428 </programlisting>
429  </para>
430
431  <para>
432   When two arrays with an equal number of dimensions are concatenated, the
433   result retains the lower bound subscript of the left-hand operand's outer
434   dimension. The result is an array comprising every element of the left-hand
435   operand followed by every element of the right-hand operand. For example:
436 <programlisting>
437 SELECT array_dims(ARRAY[1,2] || ARRAY[3,4,5]);
438  array_dims
439 ------------
440  [1:5]
441 (1 row)
442
443 SELECT array_dims(ARRAY[[1,2],[3,4]] || ARRAY[[5,6],[7,8],[9,0]]);
444  array_dims
445 ------------
446  [1:5][1:2]
447 (1 row)
448 </programlisting>
449  </para>
450
451  <para>
452   When an <replaceable>N</>-dimensional array is pushed on to the beginning
453   or end of an <replaceable>N+1</>-dimensional array, the result is
454   analogous to the element-array case above. Each <replaceable>N</>-dimensional
455   sub-array is essentially an element of the <replaceable>N+1</>-dimensional
456   array's outer dimension. For example:
457 <programlisting>
458 SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]);
459  array_dims
460 ------------
461  [1:3][1:2]
462 (1 row)
463 </programlisting>
464  </para>
465
466  <para>
467   An array can also be constructed by using the functions
468   <function>array_prepend</function>, <function>array_append</function>,
469   or <function>array_cat</function>. The first two only support one-dimensional
470   arrays, but <function>array_cat</function> supports multidimensional arrays.
471
472   Note that the concatenation operator discussed above is preferred over
473   direct use of these functions. In fact, the functions exist primarily for use
474   in implementing the concatenation operator. However, they might be directly
475   useful in the creation of user-defined aggregates. Some examples:
476
477 <programlisting>
478 SELECT array_prepend(1, ARRAY[2,3]);
479  array_prepend
480 ---------------
481  {1,2,3}
482 (1 row)
483
484 SELECT array_append(ARRAY[1,2], 3);
485  array_append
486 --------------
487  {1,2,3}
488 (1 row)
489
490 SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);
491  array_cat
492 -----------
493  {1,2,3,4}
494 (1 row)
495
496 SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]);
497       array_cat
498 ---------------------
499  {{1,2},{3,4},{5,6}}
500 (1 row)
501
502 SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);
503       array_cat
504 ---------------------
505  {{5,6},{1,2},{3,4}}
506 </programlisting>
507  </para>
508  </sect2>
509
510  <sect2 id="arrays-searching">
511   <title>Searching in Arrays</title>
512
513   <indexterm>
514    <primary>array</primary>
515    <secondary>searching</secondary>
516   </indexterm>
517
518  <para>
519   To search for a value in an array, you must check each value of the
520   array. This can be done by hand, if you know the size of the array.
521   For example:
522
523 <programlisting>
524 SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
525                             pay_by_quarter[2] = 10000 OR
526                             pay_by_quarter[3] = 10000 OR
527                             pay_by_quarter[4] = 10000;
528 </programlisting>
529
530   However, this quickly becomes tedious for large arrays, and is not
531   helpful if the size of the array is uncertain. An alternative method is
532   described in <xref linkend="functions-comparisons">. The above
533   query could be replaced by:
534
535 <programlisting>
536 SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);
537 </programlisting>
538
539   In addition, you could find rows where the array had all values
540   equal to 10000 with:
541
542 <programlisting>
543 SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
544 </programlisting>
545
546  </para>
547
548  <para>
549   Alternatively, the <function>generate_subscripts</> function can be used.
550   For example:
551
552 <programlisting>
553 SELECT * FROM
554    (SELECT pay_by_quarter,
555            generate_subscripts(pay_by_quarter, 1) AS s
556       FROM sal_emp) AS foo
557  WHERE pay_by_quarter[s] = 10000;
558 </programlisting>
559
560   This function is described in <xref linkend="functions-srf-subscripts">.
561  </para>
562
563  <tip>
564   <para>
565    Arrays are not sets; searching for specific array elements
566    can be a sign of database misdesign.  Consider
567    using a separate table with a row for each item that would be an
568    array element.  This will be easier to search, and is likely to
569    scale up better to large numbers of elements.
570   </para>
571  </tip>
572  </sect2>
573
574  <sect2 id="arrays-io">
575   <title>Array Input and Output Syntax</title>
576
577   <indexterm>
578    <primary>array</primary>
579    <secondary>I/O</secondary>
580   </indexterm>
581
582   <para>
583    The external text representation of an array value consists of items that
584    are interpreted according to the I/O conversion rules for the array's
585    element type, plus decoration that indicates the array structure.
586    The decoration consists of curly braces (<literal>{</> and <literal>}</>)
587    around the array value plus delimiter characters between adjacent items.
588    The delimiter character is usually a comma (<literal>,</>) but can be
589    something else: it is determined by the <literal>typdelim</> setting
590    for the array's element type.  (Among the standard data types provided
591    in the <productname>PostgreSQL</productname> distribution, type
592    <literal>box</> uses a semicolon (<literal>;</>) but all the others
593    use comma.)  In a multidimensional array, each dimension (row, plane,
594    cube, etc.) gets its own level of curly braces, and delimiters
595    must be written between adjacent curly-braced entities of the same level.
596   </para>
597
598   <para>
599    The array output routine will put double quotes around element values
600    if they are empty strings, contain curly braces, delimiter characters,
601    double quotes, backslashes, or white space, or match the word
602    <literal>NULL</>.  Double quotes and backslashes
603    embedded in element values will be backslash-escaped.  For numeric
604    data types it is safe to assume that double quotes will never appear, but
605    for textual data types one should be prepared to cope with either presence
606    or absence of quotes.
607   </para>
608
609   <para>
610    By default, the lower bound index value of an array's dimensions is
611    set to one.  To represent arrays with other lower bounds, the array
612    subscript ranges can be specified explicitly before writing the
613    array contents.
614    This decoration consists of square brackets (<literal>[]</>)
615    around each array dimension's lower and upper bounds, with
616    a colon (<literal>:</>) delimiter character in between. The
617    array dimension decoration is followed by an equal sign (<literal>=</>).
618    For example:
619 <programlisting>
620 SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
621  FROM (SELECT '[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[] AS f1) AS ss;
622
623  e1 | e2
624 ----+----
625   1 |  6
626 (1 row)
627 </programlisting>
628    The array output routine will include explicit dimensions in its result
629    only when there are one or more lower bounds different from one.
630   </para>
631
632   <para>
633    If the value written for an element is <literal>NULL</> (in any case
634    variant), the element is taken to be NULL.  The presence of any quotes
635    or backslashes disables this and allows the literal string value
636    <quote>NULL</> to be entered.  Also, for backwards compatibility with
637    pre-8.2 versions of <productname>PostgreSQL</>, the <xref
638    linkend="guc-array-nulls"> configuration parameter might be turned
639    <literal>off</> to suppress recognition of <literal>NULL</> as a NULL.
640   </para>
641
642   <para>
643    As shown previously, when writing an array value you can write double
644    quotes around any individual array element. You <emphasis>must</> do so
645    if the element value would otherwise confuse the array-value parser.
646    For example, elements containing curly braces, commas (or whatever the
647    delimiter character is), double quotes, backslashes, or leading or trailing
648    whitespace must be double-quoted.  Empty strings and strings matching the
649    word <literal>NULL</> must be quoted, too.  To put a double quote or
650    backslash in a quoted array element value, use escape string syntax
651    and precede it with a backslash. Alternatively, you can use
652    backslash-escaping to protect all data characters that would otherwise
653    be taken as array syntax.
654   </para>
655
656   <para>
657    You can write whitespace before a left brace or after a right
658    brace. You can also write whitespace before or after any individual item
659    string. In all of these cases the whitespace will be ignored. However,
660    whitespace within double-quoted elements, or surrounded on both sides by
661    non-whitespace characters of an element, is not ignored.
662   </para>
663
664  <note>
665   <para>
666    Remember that what you write in an SQL command will first be interpreted
667    as a string literal, and then as an array.  This doubles the number of
668    backslashes you need.  For example, to insert a <type>text</> array
669    value containing a backslash and a double quote, you'd need to write:
670 <programlisting>
671 INSERT ... VALUES (E'{"\\\\","\\""}');
672 </programlisting>
673    The escape string processor removes one level of backslashes, so that
674    what arrives at the array-value parser looks like <literal>{"\\","\""}</>.
675    In turn, the strings fed to the <type>text</> data type's input routine
676    become <literal>\</> and <literal>"</> respectively.  (If we were working
677    with a data type whose input routine also treated backslashes specially,
678    <type>bytea</> for example, we might need as many as eight backslashes
679    in the command to get one backslash into the stored array element.)
680    Dollar quoting (see <xref linkend="sql-syntax-dollar-quoting">) can be
681    used to avoid the need to double backslashes.
682   </para>
683  </note>
684
685  <tip>
686   <para>
687    The <literal>ARRAY</> constructor syntax (see
688    <xref linkend="sql-syntax-array-constructors">) is often easier to work
689    with than the array-literal syntax when writing array values in SQL
690    commands. In <literal>ARRAY</>, individual element values are written the
691    same way they would be written when not members of an array.
692   </para>
693  </tip>
694  </sect2>
695
696 </sect1>