Funktion die mir Informationen über Spaltendef. gibt???

Hallo zusammen,

ich bin auf der Suche nach einem eleganten Weg von einem Client aus etwas über die Definition einzelner Spalten in einer Tabelle zu erfahren. Ich stelle mir das in etwas so vor, das ich an die DB eine Anfrage schicke, vielleicht so was wie das hier:

Select definition(public.tabellenname.spaltenname)

und ich bekomm dann etwas wie “text” oder “numeric(7,2)” oder in irgend einer anderen Form zurück.

Gibt es sowas?? Kennt jemand vielleicht eine andere Möglichkeit an solche Informationen zu kommen??

Danke!

Sicher, wäre ja schlimm, wenn die DB keine Ahnung hätte, was sie da speichert. Wenn Du psql, also den Textclient aufrufst, und dort drin ein

\d tablename

machst, siehst Du ja auch die Definition der Tabelle. Und genau das ist der Trick: psql ruft auch nur mehrere SQL-Befehle auf, um an diese Daten zu kommen. Welche das sind, kannst Du sehen, wenn Du psql mit -E startest.

Also: psql -E aufrufen, dann \d

, dann siehst Du, was passiert.


Andreas

Da geb ich dir Recht, zumal Programme wie pgAdmin diese Daten auch individuell auslesen können!

Vielen Dank für den Tipp, hab mir sofort die Anweisungen angeschaut. Ich such mir jetzt die benötigte raus und bin sicher das mir das schon weiter hilft.

Unabhängig von meinem Problem ist der -E Modus (explain- Modus??) ne feine Sache!

Gruß

Für alle die es final noch interessiert. Das von mir gewünschte Resultat erzeugt die folgende Anfrage:

SELECT a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod)
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = '25527' AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum

Natürlich kann diese noch weiter angepasst werden und natürlich auch mit anderen Variablenwerten versehen :wink: .

Will man hingegen noch eine Aussage darüber ob ein Spaltenwert als NOT NULL definiert wurde bemüht man folgende Abfrage:

SELECT a.attname,
  pg_catalog.format_type(a.atttypid, a.atttypmod),
  (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
   FROM pg_catalog.pg_attrdef d
   WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
  a.attnotnull, a.attnum
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = '25494' AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum

Danke nochmal an Andreas!