Postgresql में एक विशिष्ट कॉलम वाली तालिका कैसे खोजें


92

मैं PostgreSQL 9.1 का उपयोग कर रहा हूं। मेरे पास एक तालिका का कॉलम नाम है। क्या यह स्तंभ है जो इस स्तंभ के पास है / है? यदि हां, तो कैसे?

जवाबों:


62

आप सिस्टम कैटलॉग को क्वेरी कर सकते हैं :

select c.relname
from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
where a.attname = <column name> and c.relkind = 'r'

sql fiddle demo


1
ध्यान दें कि यह प्रश्न '%' वाइल्डकार्ड को स्वीकार नहीं करता है, जबकि रवि के उत्तर में क्वेरी करता है।
स्किप्पी ले ग्रैंड गौरू

@SkippyleGrandGourou इसे "id% 'की तरह स्वीकार करता है"
jutky

यह मेरे साथ या वाइल्डकार्ड के बिना काम नहीं करता था, मुझे जानकारी का उपयोग करना था। खोज करने के लिए
खेमा

144

आप भी कर सकते हैं

 select table_name from information_schema.columns where column_name = 'your_column_name'

1
अजीब तरह से, मैंने ऐसे उदाहरण देखे हैं जहां यह क्वेरी तालिकाओं को दिखाती है कि @ RomanPekar की क्वेरी नहीं है; मुझे आश्चर्य है कि ऐसा क्यों होगा
केन बेलोव्स

1
@KenBellows मुझे लगता है कि pg_class / pg_attirbute Postgresql के नए संस्करणों के साथ बदल सकता है, जबकि info_schema ANSI विनिर्देश में परिभाषित किया गया है। इसलिए सामान्य प्रश्नों के लिए मैं कहूंगा कि यह उत्तर बेहतर है। कभी-कभी मुझे उदाहरण के लिए ऑब्जेक्ट आईडी की आवश्यकता होती है, इस मामले में मुझे डीबी-इंजन विशिष्ट तालिकाओं का उपयोग करने की आवश्यकता होती है। इसके अलावा, सूचना_देखना विचार हमेशा db इंजन विशिष्ट तालिकाओं पर एक अतिरिक्त कदम है और कभी-कभी एक (थोड़ा) बदतर प्रदर्शन का कारण बन सकता है
रोमन पाकर

मेरे पेश किए गए दो समाधानों में यह अधिक सटीक था। Pg_class क्वेरी दो (150 में से) तालिका से चूक गई। Info_schema क्वेरी ने सभी तालिकाओं पर कब्जा कर लिया। मुझे यह देखने के लिए चारों ओर खुदाई करनी होगी कि दो तालिकाओं के बाहर क्यों गिर गया। किसी भी घटना में जानकारी के लिए धन्यवाद!
थॉमस अल्टफादर गुड

7

मैंने एक आधार के रूप में @ रोमन पाकर की क्वेरी का उपयोग किया है और स्कीमा नाम जोड़ा है (मेरे मामले में प्रासंगिक)

select n.nspname as schema ,c.relname
    from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
    inner join pg_namespace as n on c.relnamespace = n.oid
where a.attname = 'id_number' and c.relkind = 'r'

sql fiddle demo


1

सीधे शब्दों में:

$ psql mydatabase -c '\d *' | grep -B10 'mycolname'

यदि आवश्यकता हो तो तालिका-नाम प्राप्त करने के लिए वृद्धि -B ऑफसेट करें


1

वाइल्डकार्ड समर्थन तालिका स्कीमा और तालिका नाम ढूंढें जिसमें वह स्ट्रिंग है जिसे आप ढूंढना चाहते हैं।

select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name
                                and c.table_schema = t.table_schema
where c.column_name like '%STRING%'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

0
select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name 
                                and c.table_schema = t.table_schema
where c.column_name = 'name_colum'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

2
अपने कोड के लिए स्पष्टीकरण शामिल करने के लिए कृपया अपना उत्तर संपादित करें । सवाल छह साल से अधिक पुराना है , और पहले से ही कई अच्छी तरह से समझाए गए, अच्छी तरह से समझाए गए लोगों के अलावा एक स्वीकृत जवाब है। आपके उत्तर पर इस तरह के स्पष्टीकरण के बिना, इसे नीचे या हटाए जाने के लिए खड़ा है। उस अतिरिक्त जानकारी को जोड़ने से आपके उत्तर के निरंतर अस्तित्व को सही ठहराने में मदद मिलेगी।
दास_गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.