]> granicus.if.org Git - postgresql/blob - doc/src/sgml/array.sgml
remove tags.
[postgresql] / doc / src / sgml / array.sgml
1 <!-- doc/src/sgml/array.sgml -->
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 ignores any supplied array size
58   limits, i.e., the behavior is the same as for arrays of unspecified
59   length.
60  </para>
61
62  <para>
63   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 the array size or number of dimensions 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 by using
73   the keyword <literal>ARRAY</>, can 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, all use a comma
111    (<literal>,</>), except for type <type>box</> which uses a semicolon
112    (<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   Multidimensional arrays must have matching extents for each
168   dimension. A mismatch causes an error, for example:
169
170 <programlisting>
171 INSERT INTO sal_emp
172     VALUES ('Bill',
173     '{10000, 10000, 10000, 10000}',
174     '{{"meeting", "lunch"}, {"meeting"}}');
175 ERROR:  multidimensional arrays must have array expressions with matching dimensions
176 </programlisting>
177  </para>
178
179  <para>
180   The <literal>ARRAY</> constructor syntax can also be used:
181 <programlisting>
182 INSERT INTO sal_emp
183     VALUES ('Bill',
184     ARRAY[10000, 10000, 10000, 10000],
185     ARRAY[['meeting', 'lunch'], ['training', 'presentation']]);
186
187 INSERT INTO sal_emp
188     VALUES ('Carol',
189     ARRAY[20000, 25000, 25000, 25000],
190     ARRAY[['breakfast', 'consulting'], ['meeting', 'lunch']]);
191 </programlisting>
192   Notice that the array elements are ordinary SQL constants or
193   expressions; for instance, string literals are single quoted, instead of
194   double quoted as they would be in an array literal.  The <literal>ARRAY</>
195   constructor syntax is discussed in more detail in
196   <xref linkend="sql-syntax-array-constructors">.
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.
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 a
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 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
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 instead of
298   returning null.
299  </para>
300
301  <para>
302   The current dimensions of any array value can be retrieved with the
303   <function>array_dims</function> function:
304
305 <programlisting>
306 SELECT array_dims(schedule) FROM sal_emp WHERE name = 'Carol';
307
308  array_dims
309 ------------
310  [1:2][1:2]
311 (1 row)
312 </programlisting>
313
314   <function>array_dims</function> produces a <type>text</type> result,
315   which is convenient for people to read but perhaps inconvenient
316   for programs.  Dimensions can also be retrieved with
317   <function>array_upper</function> and <function>array_lower</function>,
318   which return the upper and lower bound of a
319   specified array dimension, respectively:
320
321 <programlisting>
322 SELECT array_upper(schedule, 1) FROM sal_emp WHERE name = 'Carol';
323
324  array_upper
325 -------------
326            2
327 (1 row)
328 </programlisting>
329
330  <function>array_length</function> will return the length of a specified
331  array dimension:
332
333 <programlisting>
334 SELECT array_length(schedule, 1) FROM sal_emp WHERE name = 'Carol';
335
336  array_length
337 --------------
338             2
339 (1 row)
340 </programlisting>
341  </para>
342  </sect2>
343
344  <sect2 id="arrays-modifying">
345   <title>Modifying Arrays</title>
346
347   <indexterm>
348    <primary>array</primary>
349    <secondary>modifying</secondary>
350   </indexterm>
351
352  <para>
353   An array value can be replaced completely:
354
355 <programlisting>
356 UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
357     WHERE name = 'Carol';
358 </programlisting>
359
360   or using the <literal>ARRAY</literal> expression syntax:
361
362 <programlisting>
363 UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
364     WHERE name = 'Carol';
365 </programlisting>
366
367   An array can also be updated at a single element:
368
369 <programlisting>
370 UPDATE sal_emp SET pay_by_quarter[4] = 15000
371     WHERE name = 'Bill';
372 </programListing>
373
374   or updated in a slice:
375
376 <programlisting>
377 UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
378     WHERE name = 'Carol';
379 </programlisting>
380
381  </para>
382
383  <para>
384   A stored array value can be enlarged by assigning to elements not already
385   present.  Any positions between those previously present and the newly
386   assigned elements will be filled with nulls.  For example, if array
387   <literal>myarray</> currently has 4 elements, it will have six
388   elements after an update that assigns to <literal>myarray[6]</>;
389   <literal>myarray[5]</> will contain null.
390   Currently, enlargement in this fashion is only allowed for one-dimensional
391   arrays, not multidimensional arrays.
392  </para>
393
394  <para>
395   Subscripted assignment allows creation of arrays that do not use one-based
396   subscripts.  For example one might assign to <literal>myarray[-2:7]</> to
397   create an array with subscript values from -2 to 7.
398  </para>
399
400  <para>
401   New array values can also be constructed using the concatenation operator,
402   <literal>||</literal>:
403 <programlisting>
404 SELECT ARRAY[1,2] || ARRAY[3,4];
405  ?column?
406 -----------
407  {1,2,3,4}
408 (1 row)
409
410 SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]];
411       ?column?
412 ---------------------
413  {{5,6},{1,2},{3,4}}
414 (1 row)
415 </programlisting>
416  </para>
417
418  <para>
419   The concatenation operator allows a single element to be pushed onto the
420   beginning or end of a one-dimensional array. It also accepts two
421   <replaceable>N</>-dimensional arrays, or an <replaceable>N</>-dimensional
422   and an <replaceable>N+1</>-dimensional array.
423  </para>
424
425  <para>
426   When a single element is pushed onto either the beginning or end of a
427   one-dimensional array, the result is an array with the same lower bound
428   subscript as the array operand. For example:
429 <programlisting>
430 SELECT array_dims(1 || '[0:1]={2,3}'::int[]);
431  array_dims
432 ------------
433  [0:2]
434 (1 row)
435
436 SELECT array_dims(ARRAY[1,2] || 3);
437  array_dims
438 ------------
439  [1:3]
440 (1 row)
441 </programlisting>
442  </para>
443
444  <para>
445   When two arrays with an equal number of dimensions are concatenated, the
446   result retains the lower bound subscript of the left-hand operand's outer
447   dimension. The result is an array comprising every element of the left-hand
448   operand followed by every element of the right-hand operand. For example:
449 <programlisting>
450 SELECT array_dims(ARRAY[1,2] || ARRAY[3,4,5]);
451  array_dims
452 ------------
453  [1:5]
454 (1 row)
455
456 SELECT array_dims(ARRAY[[1,2],[3,4]] || ARRAY[[5,6],[7,8],[9,0]]);
457  array_dims
458 ------------
459  [1:5][1:2]
460 (1 row)
461 </programlisting>
462  </para>
463
464  <para>
465   When an <replaceable>N</>-dimensional array is pushed onto the beginning
466   or end of an <replaceable>N+1</>-dimensional array, the result is
467   analogous to the element-array case above. Each <replaceable>N</>-dimensional
468   sub-array is essentially an element of the <replaceable>N+1</>-dimensional
469   array's outer dimension. For example:
470 <programlisting>
471 SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]);
472  array_dims
473 ------------
474  [1:3][1:2]
475 (1 row)
476 </programlisting>
477  </para>
478
479  <para>
480   An array can also be constructed by using the functions
481   <function>array_prepend</function>, <function>array_append</function>,
482   or <function>array_cat</function>. The first two only support one-dimensional
483   arrays, but <function>array_cat</function> supports multidimensional arrays.
484
485   Note that the concatenation operator discussed above is preferred over
486   direct use of these functions. In fact, these functions primarily exist for use
487   in implementing the concatenation operator. However, they might be directly
488   useful in the creation of user-defined aggregates. Some examples:
489
490 <programlisting>
491 SELECT array_prepend(1, ARRAY[2,3]);
492  array_prepend
493 ---------------
494  {1,2,3}
495 (1 row)
496
497 SELECT array_append(ARRAY[1,2], 3);
498  array_append
499 --------------
500  {1,2,3}
501 (1 row)
502
503 SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);
504  array_cat
505 -----------
506  {1,2,3,4}
507 (1 row)
508
509 SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]);
510       array_cat
511 ---------------------
512  {{1,2},{3,4},{5,6}}
513 (1 row)
514
515 SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);
516       array_cat
517 ---------------------
518  {{5,6},{1,2},{3,4}}
519 </programlisting>
520  </para>
521  </sect2>
522
523  <sect2 id="arrays-searching">
524   <title>Searching in Arrays</title>
525
526   <indexterm>
527    <primary>array</primary>
528    <secondary>searching</secondary>
529   </indexterm>
530
531  <para>
532   To search for a value in an array, each value must be checked.
533   This can be done manually, if you know the size of the array.
534   For example:
535
536 <programlisting>
537 SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
538                             pay_by_quarter[2] = 10000 OR
539                             pay_by_quarter[3] = 10000 OR
540                             pay_by_quarter[4] = 10000;
541 </programlisting>
542
543   However, this quickly becomes tedious for large arrays, and is not
544   helpful if the size of the array is unknown. An alternative method is
545   described in <xref linkend="functions-comparisons">. The above
546   query could be replaced by:
547
548 <programlisting>
549 SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);
550 </programlisting>
551
552   In addition, you can find rows where the array has all values
553   equal to 10000 with:
554
555 <programlisting>
556 SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
557 </programlisting>
558
559  </para>
560
561  <para>
562   Alternatively, the <function>generate_subscripts</> function can be used.
563   For example:
564
565 <programlisting>
566 SELECT * FROM
567    (SELECT pay_by_quarter,
568            generate_subscripts(pay_by_quarter, 1) AS s
569       FROM sal_emp) AS foo
570  WHERE pay_by_quarter[s] = 10000;
571 </programlisting>
572
573   This function is described in <xref linkend="functions-srf-subscripts">.
574  </para>
575
576  <tip>
577   <para>
578    Arrays are not sets; searching for specific array elements
579    can be a sign of database misdesign.  Consider
580    using a separate table with a row for each item that would be an
581    array element.  This will be easier to search, and is likely to
582    scale better for a large number of elements.
583   </para>
584  </tip>
585  </sect2>
586
587  <sect2 id="arrays-io">
588   <title>Array Input and Output Syntax</title>
589
590   <indexterm>
591    <primary>array</primary>
592    <secondary>I/O</secondary>
593   </indexterm>
594
595   <para>
596    The external text representation of an array value consists of items that
597    are interpreted according to the I/O conversion rules for the array's
598    element type, plus decoration that indicates the array structure.
599    The decoration consists of curly braces (<literal>{</> and <literal>}</>)
600    around the array value plus delimiter characters between adjacent items.
601    The delimiter character is usually a comma (<literal>,</>) but can be
602    something else: it is determined by the <literal>typdelim</> setting
603    for the array's element type.  Among the standard data types provided
604    in the <productname>PostgreSQL</productname> distribution, all use a comma,
605    except for type <type>box</>, which uses a semicolon (<literal>;</>).
606    In a multidimensional array, each dimension (row, plane,
607    cube, etc.) gets its own level of curly braces, and delimiters
608    must be written between adjacent curly-braced entities of the same level.
609   </para>
610
611   <para>
612    The array output routine will put double quotes around element values
613    if they are empty strings, contain curly braces, delimiter characters,
614    double quotes, backslashes, or white space, or match the word
615    <literal>NULL</>.  Double quotes and backslashes
616    embedded in element values will be backslash-escaped.  For numeric
617    data types it is safe to assume that double quotes will never appear, but
618    for textual data types one should be prepared to cope with either the presence
619    or absence of quotes.
620   </para>
621
622   <para>
623    By default, the lower bound index value of an array's dimensions is
624    set to one.  To represent arrays with other lower bounds, the array
625    subscript ranges can be specified explicitly before writing the
626    array contents.
627    This decoration consists of square brackets (<literal>[]</>)
628    around each array dimension's lower and upper bounds, with
629    a colon (<literal>:</>) delimiter character in between. The
630    array dimension decoration is followed by an equal sign (<literal>=</>).
631    For example:
632 <programlisting>
633 SELECT f1[1][-2][3] AS e1, f1[1][-1][5] AS e2
634  FROM (SELECT '[1:1][-2:-1][3:5]={{{1,2,3},{4,5,6}}}'::int[] AS f1) AS ss;
635
636  e1 | e2
637 ----+----
638   1 |  6
639 (1 row)
640 </programlisting>
641    The array output routine will include explicit dimensions in its result
642    only when there are one or more lower bounds different from one.
643   </para>
644
645   <para>
646    If the value written for an element is <literal>NULL</> (in any case
647    variant), the element is taken to be NULL.  The presence of any quotes
648    or backslashes disables this and allows the literal string value
649    <quote>NULL</> to be entered.  Also, for backwards compatibility with
650    pre-8.2 versions of <productname>PostgreSQL</>, the <xref
651    linkend="guc-array-nulls"> configuration parameter can be turned
652    <literal>off</> to suppress recognition of <literal>NULL</> as a NULL.
653   </para>
654
655   <para>
656    As shown previously, when writing an array value you can use double
657    quotes around any individual array element. You <emphasis>must</> do so
658    if the element value would otherwise confuse the array-value parser.
659    For example, elements containing curly braces, commas (or the data type's
660    delimiter character), double quotes, backslashes, or leading or trailing
661    whitespace must be double-quoted.  Empty strings and strings matching the
662    word <literal>NULL</> must be quoted, too.  To put a double quote or
663    backslash in a quoted array element value, use escape string syntax
664    and precede it with a backslash. Alternatively, you can avoid quotes and use
665    backslash-escaping to protect all data characters that would otherwise
666    be taken as array syntax.
667   </para>
668
669   <para>
670    You can add whitespace before a left brace or after a right
671    brace. You can also add whitespace before or after any individual item
672    string. In all of these cases the whitespace will be ignored. However,
673    whitespace within double-quoted elements, or surrounded on both sides by
674    non-whitespace characters of an element, is not ignored.
675   </para>
676
677  <note>
678   <para>
679    Remember that what you write in an SQL command will first be interpreted
680    as a string literal, and then as an array.  This doubles the number of
681    backslashes you need.  For example, to insert a <type>text</> array
682    value containing a backslash and a double quote, you'd need to write:
683 <programlisting>
684 INSERT ... VALUES (E'{"\\\\","\\""}');
685 </programlisting>
686    The escape string processor removes one level of backslashes, so that
687    what arrives at the array-value parser looks like <literal>{"\\","\""}</>.
688    In turn, the strings fed to the <type>text</> data type's input routine
689    become <literal>\</> and <literal>"</> respectively.  (If we were working
690    with a data type whose input routine also treated backslashes specially,
691    <type>bytea</> for example, we might need as many as eight backslashes
692    in the command to get one backslash into the stored array element.)
693    Dollar quoting (see <xref linkend="sql-syntax-dollar-quoting">) can be
694    used to avoid the need to double backslashes.
695   </para>
696  </note>
697
698  <tip>
699   <para>
700    The <literal>ARRAY</> constructor syntax (see
701    <xref linkend="sql-syntax-array-constructors">) is often easier to work
702    with than the array-literal syntax when writing array values in SQL
703    commands. In <literal>ARRAY</>, individual element values are written the
704    same way they would be written when not members of an array.
705   </para>
706  </tip>
707  </sect2>
708
709 </sect1>