Abfrage eines _int4-Feldes

Hallo zusammen!

Ich bin neu hier und Anfänger was SQL angeht.
Ich arbeite gerade an einer PostgreSQl/PostGIS-Datenbank (PostgreSQl 9.5, pgAdmin III).

Mein Problem ist die Formulierung einer SQL-Abfrage.

Tabellenname: ax_gebietsgrenze
Spaltenname: artdergebietsgrenze
Typ: _int4
Länge: -1
Genauigkeit: 0

Feldinhalte sind z.B.:

! {7107,7106} !

! {7107,7102,7106} !

! {7106,7102,7107} !

! {7107} !

Wie kann ich erreichen das mir nur die Datensätze ausgegeben werden die 3 Werte beinhalten?
(also {7107,7102,7106} oder {7102,7106,7107} … )

Ebenso verwundern mich die geschwungenen Klammern in den Datensätzen. Was hat es damit eigentlich auf sich?

Vielen Dank im Voraus für eure Unterstützung!

Viele Grüße
Mirco

der Feldtyp ist int[], nicht nur int. Es ist ein Array.

test=*# select * from mirco;
 id |       data        
----+-------------------
  1 | {123}
  2 | {123,234}
  3 | {123,234,345}
  4 | {123,234,345,456}
(4 rows)

test=*# select *, array_length(data,1) from mirco;
 id |       data        | array_length 
----+-------------------+--------------
  1 | {123}             |            1
  2 | {123,234}         |            2
  3 | {123,234,345}     |            3
  4 | {123,234,345,456} |            4
(4 rows)

test=*# select *, array_length(data,1) from mirco where array_length(data,1) = 3;
 id |     data      | array_length 
----+---------------+--------------
  3 | {123,234,345} |            3
(1 row)

test=*#

die {} kommen, weil es ein ARRAY ist. Siehe Doku, z.B. https://www.postgresql.org/docs/9.5/functions-array.html

Hallo akretschmer!

Tausend Dank für die schnelle Antwort. Es funktioniert! :slight_smile:
Und Danke auch für den Link - werde ich nachlesen!

Viele Grüße
Mirco

Ich würde gerne noch eine Frage stellen:

Wie sähe denn die Abfrage aus wenn ich nach bestimmten 3 Werten, die in dem Arrayfeld enthalten sein sollen, suche?

z.B: Es sollen {123} und {345} und {678} enthalten sein

Nochmals vielen Dank im Voraus! :slight_smile:

Mirco

Du kannst Den “contains” Operator nehmen:

where array_spalte @> array[123,456,678]
test=*# select * from mirco where data @> array[123];
 id |       data        
----+-------------------
  1 | {123}
  2 | {123,234}
  3 | {123,234,345}
  4 | {123,234,345,456}
(4 rows)

test=*# select * from mirco where data @> array[234, 123];
 id |       data        
----+-------------------
  2 | {123,234}
  3 | {123,234,345}
  4 | {123,234,345,456}
(3 rows)

test=*# select * from mirco where data @> array[234, 123, 456];
 id |       data        
----+-------------------
  4 | {123,234,345,456}
(1 row)

test=*#

Wenn die Tabelle größer sein sollte würde ein GiST-Index auf dem Feld die Abfrage auch indexbasiert beschleunigen.

Vielen Dank!

Ich habe mir auch gerade folgende Lösung erarbeitet:

select * from ax_gebietsgrenze where artdergebietsgrenze @> ‘{7106,7107,7102}’; (funktioniert)

oder deine Lösung:

select * from ax_gebietsgrenze where artdergebietsgrenze @> array[7106,7107,7102]; (funktioniert auch)

Welche wäre denn die allgemeingültigere?

Tausend Dank jedenfalls! Super-Forum hier :slight_smile:

sollten beide Formen gleichwertig sein.

Ich bevorzuge (offensichtlich) die Schreibweise mit array[] da man hier die Werte in der normalen “Schreibweise” des Datentyps angegeben kann. Bei Strings hat man dann z.B. nicht das Problem mit Anführungszeichen innerhalb von Anführungszeichen.