Frage

Wie kann ich Datentyp spezifischen Feld aus der Tabelle in Postgres bekommen? Beispielsweise Ich habe die folgende Tabelle,   student_details (        stu_id ganze Zahl ist,        stu_name VARCHAR (30),        joined_date Zeitstempel    );

In dieser die Feldnamen / oder andere Art und Weise, ich brauche den Datentyp des spezifischen Bereichs zu erhalten. Gibt es eine Möglichkeit?

Keine korrekte Lösung

Andere Tipps

Sie können die Datentypen aus dem information_schema (8.4 docs hier Bezug genommen wird, aber dies ist kein neues Feature):

=# select column_name, data_type from information_schema.columns
-# where table_name = 'config';
    column_name     | data_type 
--------------------+-----------
 id                 | integer
 default_printer_id | integer
 master_host_enable | boolean
(3 rows)

Sie können mit der pg_typeof ( ) -Funktion, die auch gut für beliebige Werte funktioniert.

SELECT pg_typeof("stu_id"), pg_typeof(100) from student_details limit 1;

laufen psql -E und dann \d student_details

Versuchen Sie, diese Anfrage:

SELECT column_name, data_type FROM information_schema.columns WHERE 
table_name = 'YOUR_TABLE' AND column_name = 'YOUR_FIELD';

Wenn Sie wie ‚Mike Sherrill‘ Lösung, aber nicht psql verwendet werden soll, habe ich diese Abfrage, die fehlenden Informationen zu erhalten:

select column_name,
case 
    when domain_name is not null then domain_name
    when data_type='character varying' THEN 'varchar('||character_maximum_length||')'
    when data_type='numeric' THEN 'numeric('||numeric_precision||','||numeric_scale||')'
    else data_type
end as myType
from information_schema.columns
where table_name='test'

mit:

column_name |     myType
-------------+-------------------
 test_id     | test_domain
 test_vc     | varchar(15)
 test_n      | numeric(15,3)
 big_n       | bigint
 ip_addr     | inet

Die Informationsschemata Ansichten und pg_typeof () gibt unvollständige Typinformationen. Von diesen Antworten gibt psql die präziseste Art Informationen. (Die OP ist vielleicht nicht so genaue Informationen benötigen, sollten aber die Grenzen kennen.)

create domain test_domain as varchar(15);

create table test (
  test_id test_domain, 
  test_vc varchar(15), 
  test_n numeric(15, 3), 
  big_n bigint,
  ip_addr inet
);

Mit psql und \d public.test korrekt zeigt die Verwendung des Datentyp test_domain, die Länge von varchar (n) Spalten, und die Genauigkeit und Umfang der numerischen (p, s) Spalten.

sandbox=# \d public.test
             Table "public.test"
 Column  |         Type          | Modifiers
---------+-----------------------+-----------
 test_id | test_domain           |
 test_vc | character varying(15) |
 test_n  | numeric(15,3)         |
 big_n   | bigint                |
 ip_addr | inet                  |

Diese Abfrage für eine information_schema beurteilt nicht zeigt die Verwendung von test_domain überhaupt. Es meldet auch nicht die Details varchar (n) und numeric (p, s) Spalten.

select column_name, data_type 
from information_schema.columns 
where table_catalog = 'sandbox'
  and table_schema = 'public'
  and table_name = 'test';
 column_name |     data_type
-------------+-------------------
 test_id     | character varying
 test_vc     | character varying
 test_n      | numeric
 big_n       | bigint
 ip_addr     | inet

Sie könnte der Lage sein, alle diese Informationen zu erhalten, indem andere information_schema Ansichten Beitritt oder durch die Systemtabellen direkt abfragen. psql -E könnte helfen mit, dass.

Die Funktion pg_typeof() richtig zeigt die Verwendung von test_domain, aber nicht meldet die Details varchar (n) und numeric (p, s) Spalten.

select pg_typeof(test_id) as test_id, 
       pg_typeof(test_vc) as test_vc,
       pg_typeof(test_n) as test_n,
       pg_typeof(big_n) as big_n,
       pg_typeof(ip_addr) as ip_addr
from test;
   test_id   |      test_vc      | test_n  | big_n  | ip_addr
-------------+-------------------+---------+--------+---------
 test_domain | character varying | numeric | bigint | inet

Daten Pulling Art von information_schema möglich ist, aber nicht bequem (erfordert Verbinden mehrere Spalten mit einer case Anweisung). Alternativ kann man format_type eingebaute Funktion verwenden, das zu tun, aber es funktioniert auf interne Typbezeichner, die sichtbar in pg_attribute sind aber nicht in information_schema. Beispiel

SELECT a.attname as column_name, format_type(a.atttypid, a.atttypmod) AS data_type
FROM pg_attribute a JOIN pg_class b ON a.attrelid = b.relfilenode
WHERE a.attnum > 0 -- hide internal columns
AND NOT a.attisdropped -- hide deleted columns
AND b.oid = 'my_table'::regclass::oid; -- example way to find pg_class entry for a table

Basierend auf https://gis.stackexchange.com/a/97834 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top