PostgreSQL में एक तालिका के सूची स्तंभ नाम और डेटाटिप्स कैसे प्राप्त करें?


95

मैं एक क्वेरी का उपयोग करके PostgreSQL में तालिका के स्तंभ नामों और डेटाटिप्स की सूची कैसे प्राप्त कर सकता हूं?


plsql \ gdesc भी एक विकल्प है। साफ-सुथरी विशेषता यह है कि यह संपूर्ण प्रश्नों (जटिल एडहॉक के लिए उपयोगी) का वर्णन कर सकता है लेकिन यह सरलीकृत परिदृश्य के लिए भी काम करता है SELECT * FROM tab_name \gdesc
लुकाज़ स्ज़ोज़ा

जवाबों:


136

psqlकमांड लाइन खोलें और टाइप करें:

\d+ table_name

2
मुझे समझ नहीं आता कि यह सबसे उत्कट उत्तर क्यों नहीं है।
मेज़ीज़ी

20
यह अधूरा है क्योंकि ओपी इस प्रोग्राम को SQL कोड में करना चाहता है, न कि psql के माध्यम से।
ल्यूक

पोस्टग्रैजेस इसे प्रोग्रामेटिक रूप से करता है, इसलिए बस 'ई-फ्लैग' के साथ पोस्टग्रेज शुरू करें: psql -Eऔर हर बैकस्लैश कमांड के लिए संबंधित एसक्यूएल कमांड के परिणाम से पहले प्रदर्शित किया जाएगा।
कराटेगॉग

123
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

उपरोक्त क्वेरी के साथ आप कॉलम और इसके डेटा टाइप कर सकते हैं


5
यह उपयोगकर्ता-परिभाषित प्रकारों के लिए सही उत्तर नहीं देगा (उदाहरण के लिए, ogr2ogr द्वारा बनाए गए ज्यामिति और भूगोल कॉलम , जो फॉर्म के हैं geometry(Geometry,[SRID]))।
जी.टी.

1
एक भी इस्तेमाल कर सकते हैं table_catalog = 'my_database'और table_schema = 'my_schema'किसी विशिष्ट डेटाबेस की एक विशिष्ट स्कीमा की एक विशेष मेज से केवल कॉलम प्राप्त करने के लिए।
मार्को मानेस

यदि आप इस कोड का निर्माण करना चाहते हैं, तो मैं सभी को सुझाव दूंगा। का उपयोग करें pg_catalogऔर नहीं information_schemainformation_schemaकुछ बहुत आसान और सार्वभौमिक एसक्यूएल है, लेकिन यह धीमी है क्योंकि यह उच्च स्तर है।
डैनियल एल। वनडेनबॉश

24
SELECT
        a.attname as "Column",
        pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
    FROM
        pg_catalog.pg_attribute a
    WHERE
        a.attnum > 0
        AND NOT a.attisdropped
        AND a.attrelid = (
            SELECT c.oid
            FROM pg_catalog.pg_class c
                LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relname ~ '^(hello world)$'
                AND pg_catalog.pg_table_is_visible(c.oid)
        );

अपनी टेबल के नाम के साथ हैलो दुनिया को बदलें

इसके बारे में अधिक जानकारी: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html


2
काम करता है, लेकिन आप c.relname ~ '^(hello world)$बस के बजाय क्यों उपयोग कर रहे हैं c.relname = 'hello world'?
थॉमस

18

यदि आपके पास एक ही तालिका नामों के साथ कई स्कीमा हैं, तो स्कीमा नाम जोड़ना न भूलें।

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name';

या psql का उपयोग कर:

\d+ your_schema_name.your_table_name

8

एक संस्करण जो एक विशिष्ट स्कीमा में स्तंभ नाम और तालिका के प्रकार खोजने का समर्थन करता है, और बिना किसी उपश्रेणी के JOINs का उपयोग करता है

SELECT
    pg_attribute.attname AS column_name,
    pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type
FROM
    pg_catalog.pg_attribute
INNER JOIN
    pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
    pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
    pg_attribute.attnum > 0
    AND NOT pg_attribute.attisdropped
    AND pg_namespace.nspname = 'my_schema'
    AND pg_class.relname = 'my_table'
ORDER BY
    attnum ASC;

यह मेरा पसंदीदा उत्तर है क्योंकि यह 2 चीजों को पूरा करता है। इसका उपयोग करता है pg_catalogऔर यह आपको स्कीमा निर्दिष्ट करने के लिए मजबूर करता है । यदि आप सार्वजनिक स्कीमा में सब कुछ समेट रहे हैं, तो मैं व्यक्तिगत रूप से मानता हूं कि यह एक खराब रणनीति है। जैसे-जैसे आपकी परियोजना बढ़ती है, चीजों को व्यवस्थित रखना मुश्किल हो जाएगा। IMHO
डैनियल एल। वनडेनबॉश

7

अधिक स्कीमा और अशक्तियों का समर्थन करने के लिए अद्यतित प्रतिक उत्तर:

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );

2
    SELECT DISTINCT
        ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid , 
        pgc.relname as table_name ,
        a.attnum as attr,
        a.attname as name,
        format_type(a.atttypid, a.atttypmod) as typ,
        a.attnotnull as notnull, 
        com.description as comment,
        coalesce(i.indisprimary,false) as primary_key,
        def.adsrc as default
    FROM pg_attribute a 
    JOIN pg_class pgc ON pgc.oid = a.attrelid
    LEFT JOIN pg_index i ON 
        (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
    LEFT JOIN pg_description com on 
        (pgc.oid = com.objoid AND a.attnum = com.objsubid)
    LEFT JOIN pg_attrdef def ON 
        (a.attrelid = def.adrelid AND a.attnum = def.adnum)
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace

    WHERE 1=1 
        AND pgc.relkind IN ('r','')
        AND n.nspname <> 'pg_catalog'
        AND n.nspname <> 'information_schema'
        AND n.nspname !~ '^pg_toast'

    AND a.attnum > 0 AND pgc.oid = a.attrelid
    AND pg_table_is_visible(pgc.oid)
    AND NOT a.attisdropped
    ORDER BY rowid
    ;

कृपया अपने कोड के साथ संदर्भ शामिल करें। इसके अलावा, आप इसे अन्य स्कीमाओं तक कैसे विस्तारित करते हैं?
डेनियल एल वानडेनबॉश

2

इस विषय को 'अधिक संपूर्ण' बनाने के लिए।

मुझे एक सेलेक्ट स्टेटमेंट (टेबल नहीं) पर कॉलम के नाम और डेटा टाइप चाहिए।

यदि आप वास्तविक मौजूदा तालिका के बजाय एक चयन कथन पर यह करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:

DROP TABLE IF EXISTS abc;
CREATE TEMPORARY TABLE abc AS
-- your select statement here!
SELECT 
    *
FROM foo
-- end your select statement
;

select column_name, data_type 
from information_schema.columns 
where table_name = 'abc';
DROP IF EXISTS abc;

संक्षिप्त विवरण, यह आपके चुनिंदा कथन की एक (अस्थायी) तालिका बनाता है, जिसे आप (दूसरों के बीच) @a_horse_with_no_name और @selva द्वारा प्रदान की गई क्वेरी के माध्यम से 'कॉल' कर सकते हैं।

उम्मीद है की यह मदद करेगा।


2

स्कीमा का उल्लेख किए बिना भी आप आवश्यक विवरण प्राप्त कर सकते हैं इस क्वेरी की कोशिश करें->

column_name, data_type से information_schema.columns का चयन करें जहाँ table_name = 'table_name';


0

तालिका के कॉलम के बारे में जानकारी प्राप्त करने के लिए, आप इसका उपयोग कर सकते हैं:

\dt+ [tablename]

तालिका में डेटाटाइप के बारे में जानकारी प्राप्त करने के लिए, आप इसका उपयोग कर सकते हैं:

\dT+ [datatype]

1
\ dt + tablename को तालिका के बारे में जानकारी मिलती है, लेकिन कोई कॉलम नहीं
zhihong

0
SELECT column_name,data_type 
FROM information_schema.columns 
WHERE
table_name = 'your_table_name' 
AND table_catalog = 'your_database_name' 
AND table_schema = 'your_schema_name';

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके।
डोनाल्ड डक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.