Categories
Software Unix

Neue Array-Operatoren in PostgreSQL 8.2

Seit Version 8.2 verfügt PostgreSQL über einige neue Operatoren, die Arrays in SQL erst richtig nützlich machen. Konnte man bislang (bis Version 8.1) nur möglich die Arrays zu verketten, Elementweise zu vergleichen oder einzelne Elemente aus dem Array wieder herauszufischen, so kann man nun auch Testen, ob zwei Arrays über gemeinsame Elemente verfügen oder gar ein Array vollständig im anderen enthalten ist. Diese neuen Operatoren sind @>, <@ und &&.

Mit @> kann man prüfen, ob das Array links des Operators eine Obermenge des Arrays rechts des Operators ist. Das Gegenstück dazu ist <@. Es prüft, ob das Array links des Operators eine Untermenge des Arrays rechts des Operators ist. Zu guter Letzt kann man noch mit && überprüfen, ob die Arrays Elemente gemeinsam haben.

Hier ein paar Beispiele, wie sich die neuen Operatoren einsetzen lassen.

test=> SELECT ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9] @> ARRAY[2, 4, 6, 8];
 ?column?
----------
 t
(1 row)

Hier muß ich wohl nichts weiter dazu sagen. Alle Elemente des zweiten Arrays sind auch im ersten enthalten, also ist das Ergebnis true.

test=> SELECT ARRAY[2, 4, 6, 8, 10] <@ ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9];
 ?column?
----------
 f
(1 row)

Hier ist das Ergebnis false, da die 10 aus dem ersten Array nicht im zweiten enthalten ist. Somit ist das erste Array keine Untermenge des zweiten Arrays.

test=> SELECT ARRAY[2, 4, 6, 8, 10] && ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9];
 ?column?
----------
 t
(1 row)

Hier dagegen ist das Ergebnis true. Die beiden Arrays haben Elemente gemeinsam (wenn auch nicht alle).

Wer noch mehr über Arrays und die dazugehörigen Operatoren in PostgreSQL lesen möchte, kann dies in der Doku tun.

Categories
Software

Mit Array in PostgreSQL herumhantieren

Ich brauchte bei einer Abfrage einfach nur die beteiligten Mitarbeiter. Eine einfache Auflistung der Namen reichte mir da. Mit PostgreSQL kann man sowas recht einfach erledigen.

SELECT array_to_string(ARRAY['foo', 'bar', 'baz', 'qux'], ', ');
  array_to_string
--------------------
 foo, bar, baz, qux
(1 row)

Das Array wird als String mit jeweils dem zweiten Parameter aus array_to_string() verkettet. Ist viel einfacher als in der Skriptsprache (PHP, Ruby, Perl) die Rows miteinander zu verketten.

Nachtrag: Und bevor jetzt einer fragt, wie das nun mit Rows aus einer Abfrage geht, hier ein Beispiel. Ich habe diese Tabelle

test=# SELECT * from test_table;
 id | some_string
----+-------------
  1 | foo
  2 | bar
  3 | baz
  4 | qux
(4 rows)

Und nun zu einer Row verkettet:

test=# SELECT array_to_string(ARRAY(SELECT some_string FROM test_table WHERE id<4), ', ');
 array_to_string
-----------------
 foo, bar, baz
(1 row)