Abfrage eines _int4-Feldes

Fragen und Probleme rund um die Abfragespache SQL.
Antworten
mirco
Neuer Benutzer
Beiträge: 6
Registriert: Do 31. Okt 2019, 08:42
Wohnort: Berlin

Abfrage eines _int4-Feldes

Beitrag von mirco » Do 31. Okt 2019, 09:36

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

akretschmer
Erfahrener Benutzer
Beiträge: 7681
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Abfrage eines _int4-Feldes

Beitrag von akretschmer » Do 31. Okt 2019, 09:45

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

Code: Alles auswählen

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=*#
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

akretschmer
Erfahrener Benutzer
Beiträge: 7681
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Abfrage eines _int4-Feldes

Beitrag von akretschmer » Do 31. Okt 2019, 09:46

die {} kommen, weil es ein ARRAY ist. Siehe Doku, z.B. https://www.postgresql.org/docs/9.5/fun ... array.html
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

mirco
Neuer Benutzer
Beiträge: 6
Registriert: Do 31. Okt 2019, 08:42
Wohnort: Berlin

Re: Abfrage eines _int4-Feldes

Beitrag von mirco » Do 31. Okt 2019, 09:55

Hallo akretschmer!

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

Viele Grüße
Mirco
PostgreSQL/PostGIS- und SQL-Anfänger

mirco
Neuer Benutzer
Beiträge: 6
Registriert: Do 31. Okt 2019, 08:42
Wohnort: Berlin

Re: Abfrage eines _int4-Feldes

Beitrag von mirco » Do 31. Okt 2019, 10:22

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! :)

Mirco
PostgreSQL/PostGIS- und SQL-Anfänger

castorp
Erfahrener Benutzer
Beiträge: 1177
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Abfrage eines _int4-Feldes

Beitrag von castorp » Do 31. Okt 2019, 10:39

Du kannst Den "contains" Operator nehmen:

Code: Alles auswählen

where array_spalte @> array[123,456,678]
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

akretschmer
Erfahrener Benutzer
Beiträge: 7681
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Abfrage eines _int4-Feldes

Beitrag von akretschmer » Do 31. Okt 2019, 10:42

Code: Alles auswählen

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.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

mirco
Neuer Benutzer
Beiträge: 6
Registriert: Do 31. Okt 2019, 08:42
Wohnort: Berlin

Re: Abfrage eines _int4-Feldes

Beitrag von mirco » Do 31. Okt 2019, 10:49

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 :)
PostgreSQL/PostGIS- und SQL-Anfänger

akretschmer
Erfahrener Benutzer
Beiträge: 7681
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Abfrage eines _int4-Feldes

Beitrag von akretschmer » Do 31. Okt 2019, 10:52

sollten beide Formen gleichwertig sein.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

castorp
Erfahrener Benutzer
Beiträge: 1177
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Abfrage eines _int4-Feldes

Beitrag von castorp » Do 31. Okt 2019, 10:55

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.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Antworten