मैं एक क्वेरी का उपयोग करके PostgreSQL में तालिका के स्तंभ नामों और डेटाटिप्स की सूची कैसे प्राप्त कर सकता हूं?
जवाबों:
psql
कमांड लाइन खोलें और टाइप करें:
\d+ table_name
psql -E
और हर बैकस्लैश कमांड के लिए संबंधित एसक्यूएल कमांड के परिणाम से पहले प्रदर्शित किया जाएगा।
select column_name,data_type
from information_schema.columns
where table_name = 'table_name';
उपरोक्त क्वेरी के साथ आप कॉलम और इसके डेटा टाइप कर सकते हैं
geometry(Geometry,[SRID])
)।
table_catalog = 'my_database'
और table_schema = 'my_schema'
किसी विशिष्ट डेटाबेस की एक विशिष्ट स्कीमा की एक विशेष मेज से केवल कॉलम प्राप्त करने के लिए।
pg_catalog
और नहीं information_schema
। information_schema
कुछ बहुत आसान और सार्वभौमिक एसक्यूएल है, लेकिन यह धीमी है क्योंकि यह उच्च स्तर है।
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
c.relname ~ '^(hello world)$
बस के बजाय क्यों उपयोग कर रहे हैं c.relname = 'hello world'
?
एक संस्करण जो एक विशिष्ट स्कीमा में स्तंभ नाम और तालिका के प्रकार खोजने का समर्थन करता है, और बिना किसी उपश्रेणी के 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;
pg_catalog
और यह आपको स्कीमा निर्दिष्ट करने के लिए मजबूर करता है । यदि आप सार्वजनिक स्कीमा में सब कुछ समेट रहे हैं, तो मैं व्यक्तिगत रूप से मानता हूं कि यह एक खराब रणनीति है। जैसे-जैसे आपकी परियोजना बढ़ती है, चीजों को व्यवस्थित रखना मुश्किल हो जाएगा। IMHO
अधिक स्कीमा और अशक्तियों का समर्थन करने के लिए अद्यतित प्रतिक उत्तर:
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'
);
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
;
इस विषय को 'अधिक संपूर्ण' बनाने के लिए।
मुझे एक सेलेक्ट स्टेटमेंट (टेबल नहीं) पर कॉलम के नाम और डेटा टाइप चाहिए।
यदि आप वास्तविक मौजूदा तालिका के बजाय एक चयन कथन पर यह करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:
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 द्वारा प्रदान की गई क्वेरी के माध्यम से 'कॉल' कर सकते हैं।
उम्मीद है की यह मदद करेगा।
स्कीमा का उल्लेख किए बिना भी आप आवश्यक विवरण प्राप्त कर सकते हैं इस क्वेरी की कोशिश करें->
column_name, data_type से information_schema.columns का चयन करें जहाँ table_name = 'table_name';
तालिका के कॉलम के बारे में जानकारी प्राप्त करने के लिए, आप इसका उपयोग कर सकते हैं:
\dt+ [tablename]
तालिका में डेटाटाइप के बारे में जानकारी प्राप्त करने के लिए, आप इसका उपयोग कर सकते हैं:
\dT+ [datatype]
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';
SELECT * FROM tab_name \gdesc
।