पोस्टग्रेज में फ़ील्ड का डेटाटाइप चुनें


165

मैं पोस्टग्रेज में टेबल से विशिष्ट क्षेत्र का डेटाटाइप कैसे प्राप्त कर सकता हूं? उदाहरण के लिए मेरे पास निम्न तालिका है, student_details (stu_id पूर्णांक, stu_name varchar (30), join_date टाइमस्टैम्प);

फ़ील्ड नाम / या किसी अन्य तरीके का उपयोग करते हुए, मुझे विशिष्ट फ़ील्ड का डेटाटाइप प्राप्त करना होगा। क्या कोई संभावना है?


1
इसके अलावा पूछा और जवाब stackoverflow.com/q/20194806/65458
Piotr Findeisen

जवाबों:


173

आप डेटा प्रकार से जानकारी प्राप्त कर सकते हैं_केम (यहाँ उल्लेखित 8.4 डॉक्स, लेकिन यह कोई नई सुविधा नहीं है):

=# 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)

इतना सरल और अच्छा! अब मैं उस मौजूदा क्वेरी को प्रतिस्थापित कर सकता हूं जो मैंने पाया है कि 310 वर्ण (तालिका नाम के बिना), 4 तालिका में शामिल होते हैं, स्कीमा के बारे में पता नहीं, महंगा है, और यह पूर्णांक के बजाय 'int4' और अन्य प्रकार के रूप में देता है। धन्यवाद!
कुछ

2
PostgreSQL आपको कई स्कीमाओं में समान तालिका नाम (यहां तक ​​कि एक समान तालिका) रखने की अनुमति देता है। यह लिखने का सबसे मजबूत तरीका यह है कि WHERE क्लॉज उस संभावना पर विचार करता है: where table_catalog = ? and table_schema = ? and table_name = ?;लेकिन यह जानकारी_समेय दृश्य यह नहीं मानता है कि DDL डोमेन का उपयोग कर सकता है ।
माइक शेरिल 'कैट रिकॉल'

1
यह आपको सरणी के प्रकार नहीं देंगे तो उसके साथ इस्तेमाल किया जाएगाpg_typeof
दारिया

146

आप pg_typeof () फ़ंक्शन का उपयोग कर सकते हैं , जो मनमानी मूल्यों के लिए भी अच्छी तरह से काम करता है।

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

यह तालिका में प्रति रिकॉर्ड एक पंक्ति देता है। यदि आपके पास लाखों रिकॉर्ड हैं तो इसे न चलाएं
Saarang

3
यह खूबसूरती से काम करता है अगर आपको यह निर्धारित करने की आवश्यकता है कि गणना का प्रकार क्या है। उदाहरण के लिए, SELECT pg_typeof( date_part( 'year', now() ) ) AS exprआप जो उम्मीद करेंगे उससे अलग है।
लियो ओरिएंटिस

यहाँ चतुर बात यह है कि pg_typeofसंग्रहीत कार्यविधियों से बाहर आने वाले क्षेत्रों के लिए काम करता है, जिसके लिए बैकएंड टेबल, यदि यह मौजूद है, तो अज्ञात / अस्पष्ट है। select state, qstart, pg_typeof(qstart) as ty_qstart from listconn()। info_schema यहाँ बहुत मदद नहीं करेगा।
JL Peyret

40

इस अनुरोध का प्रयास करें:

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

4
table_name = 'YOUR_TABLE' AND column_name = 'YOUR_FIELD';

38

दौड़ो psql -Eऔर फिर\d student_details


सरल और उपयोगी
horoyoi o

11

यदि आप 'माइक शेरिल' समाधान पसंद करते हैं, लेकिन psql का उपयोग नहीं करना चाहते हैं, तो मैंने लापता जानकारी प्राप्त करने के लिए इस क्वेरी का उपयोग किया है:

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'

परिणाम के साथ:

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

8

सूचना स्कीमा दृश्य और pg_typeof () अपूर्ण प्रकार की जानकारी लौटाते हैं। इन उत्तरों में से, psqlसबसे सटीक प्रकार की जानकारी देता है। (ओपी को ऐसी सटीक जानकारी की आवश्यकता नहीं हो सकती है, लेकिन सीमाओं को जानना चाहिए।)

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
);

डेटा प्रकार का उपयोग करना psqlऔर \d public.testसही ढंग से उपयोग करना test_domain, varchar (n) कॉलम की लंबाई, और संख्यात्मक (p, s) कॉलम की शुद्धता और पैमाने को दर्शाता है ।

सैंडबॉक्स = # \ d public.test
             टेबल "public.test"
 स्तंभ | प्रकार | संशोधक
--------- + ----------------------- + -----------
 test_id | test_domain |
 test_vc | चरित्र भिन्न (15) |
 test_n | संख्यात्मक (15,3) |
 big_n | bigint |
 ip_addr | inet |

एक सूचना_ दृश्य के खिलाफ यह क्वेरी बिल्कुल भी उपयोग नहीं दिखाती है test_domain। यह भी varchar (n) और संख्यात्मक (p, s) कॉलम के विवरण की सूचना नहीं देता है।

select column_name, data_type 
from information_schema.columns 
where table_catalog = 'sandbox'
  and table_schema = 'public'
  and table_name = 'test';
column_name | डाटा प्रकार
------------- + -------------------
 test_id | चरित्र भिन्नता
 test_vc | चरित्र भिन्नता
 test_n | संख्यात्मक
 big_n | bigint
 ip_addr | मंत्रिमंडल

आप कर सकते हैं सब, या सिस्टम टेबल सीधे पूछताछ की अन्य INFORMATION_SCHEMA विचारों में शामिल होने से है कि जानकारी प्राप्त करने में सक्षम हो। psql -Eउस के साथ मदद कर सकता है।

फ़ंक्शन pg_typeof()सही तरीके से उपयोग दिखाता है test_domain, लेकिन varchar (n) और संख्यात्मक (p, s) कॉलम के विवरण की सूचना नहीं देता है।

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 | चरित्र बदलती | सांख्यिक | bigint | मंत्रिमंडल

4

से डेटा प्रकार खींचना information_schemaसंभव है, लेकिन सुविधाजनक नहीं है (एक caseबयान के साथ कई कॉलम में शामिल होने की आवश्यकता है )। वैकल्पिक रूप से कोई ऐसा करने के लिए format_typeअंतर्निहित फ़ंक्शन का उपयोग कर सकता है, लेकिन यह आंतरिक प्रकार के पहचानकर्ताओं पर काम करता है जो दिखाई दे रहे हैं pg_attributeलेकिन अंदर नहीं information_schema। उदाहरण

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

Https://gis.stackexchange.com/a/97834 पर आधारित ।


1
पोस्टरिटी के लिए, pg10 के साथ प्रतिस्थापित b.relfilenodeकरेंb.oid
tswaters
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.