Toon posts:

[PostgreSQL] Arrays

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een beetje moeite met arrays in PostgreSQL.
Ik probeer alle users te selecteren uit 'pg_user' en met hun 'usesysid' hun groep naam te selecteren uit 'pg_group'. In de tabel 'pg_group' staan alle userid's in een array in de column 'grolist'.

Ik heb het volgende geprobeerd (zoals het in de documentatie staat):
code:
1
2
3
base=# select usename, groname from pg_user, pg_group where grolist *= usesysid;
ERROR:  Unable to identify an operator '*=' for types 'integer[]' and 'integer'
    You will have to retype this query using an explicit cast


Nou dat werkte dus niet.


Iemand een idee hoe ik een waarde uit een array in PostgreSQL kan halen zonder dat ik het aantal waardes weet?

[ Voor 11% gewijzigd door Verwijderd op 16-05-2003 10:08 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Een array in een database?

Wat wil je daar mee aanvangen. Waarom maak je geen gebruik van een gewone relatie?

https://fgheysels.github.io/


  • schijndel
  • Registratie: Juni 1999
  • Laatst online: 08:22
als je alle users met hun groupname wil selecteren, zou het volgende voldoende moeten zijn <code>select usename, groname from pg_user, pg_group where grolist = usesysid;</code>

waarom had je dat sterretje erin zitten?

Verwijderd

Topicstarter
Ik heb het hier over systeem tabellen. In de system tabel 'pg_group' staat in de column 'grolist' een array met alle userid's die lid zijn van die groep.

Ik wil een lijst maken van users en daar achter gelijk de groepnaam.

Verwijderd

Topicstarter
Grimreaper schreef op 16 May 2003 @ 10:13:
als je alle users met hun groupname wil selecteren, zou het volgende voldoende moeten zijn <code>select usename, groname from pg_user, pg_group where grolist = usesysid;</code>

waarom had je dat sterretje erin zitten?
code:
1
2
3
base=# select usename, groname from pg_user, pg_group where grolist = usesysid;
ERROR:  Unable to identify an operator '=' for types 'integer[]' and 'integer'
    You will have to retype this query using an explicit cast


Werkt dus ook niet.

Van dat sterretje stond in de documentatie. Ik kan geen url plaatsen want die site is op het moment down.

[ Voor 14% gewijzigd door Verwijderd op 16-05-2003 10:19 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Vreemd, als ik de output van \do bekijk staat heel die *= er niet tussen... En het staat inderdaad wel in de documentatie bij de array's.

Misschien dat je eerst de functionaliteit van de int-array-contrib moet laden? Maar dat zou wel heel vreemd zijn.

Linkje ;)

[ Voor 14% gewijzigd door ACM op 16-05-2003 10:34 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ow btw....
't Staat er gewoon bij:
However, this quickly becomes tedious for large arrays, and is not helpful if the size of the array is unknown. Although it is not built into PostgreSQL, there is an extension available that defines new functions and operators for iterating over array values.
To install this optional module, look in the contrib/array directory of the PostgreSQL source distribution.

Verwijderd

Topicstarter
Idd, ik lees het net ook.

Ik draai hier Debian 3.0 en heb Postgresql geinstalleerd doormiddel van apt-get. De array/contrib waar zij het over hebben zit in de package 'postgresql-contrib'. Deze blijkt gewoon bij geinstalleerd te zijn.

Dus dan vraag ik me af waarom hij het dan niet doet.

Verwijderd

Topicstarter
Er blijkt ook een functie te zijn 'array_dims' dat het aantal waardes in een array terug geeft in slices (eg: [1:5]). Ik weet alleen niet hoe ik dat zou kunnen gebruiken in combinatie met de eerder genoemde query.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 16 mei 2003 @ 10:49:
Idd, ik lees het net ook.

Ik draai hier Debian 3.0 en heb Postgresql geinstalleerd doormiddel van apt-get. De array/contrib waar zij het over hebben zit in de package 'postgresql-contrib'. Deze blijkt gewoon bij geinstalleerd te zijn.

Dus dan vraag ik me af waarom hij het dan niet doet.
Dat die package geinstalleerd is zegt nog niet dat de functionaliteit ook geladen is :)
Sterker nog, dat is het nog niet. Zie die contrib/array dir voor een README over hoe je het moet installeren.
Verwijderd schreef op 16 mei 2003 @ 10:55:
Er blijkt ook een functie te zijn 'array_dims' dat het aantal waardes in een array terug geeft in slices (eg: [1:5]). Ik weet alleen niet hoe ik dat zou kunnen gebruiken in combinatie met de eerder genoemde query.
Waarom zou je dat willen gebruiken? :)

Verwijderd

Topicstarter
Oke probleem is opgelosd.

In /usr/lib/postgresql/share/contrib blijkt een file array_iterator.sql te staan.
Deze moet je handmatig uitvoeren (eg: psql base -U postgres -f array_iterator.sql) en dan kun je de volgende query gebruiken om users + groups te selecteren:

code:
1
select usename, groname from pg_user, pg_group where grolist *= usesysid;
Pagina: 1