2012-04-03 20 views
36

का उपयोग कर तालिका में कोई कॉलम मौजूद है, तो मैं परीक्षण कैसे कर सकता हूं क्या ओरेकल में उत्पादित इस कथन में PostgreSQL में कोई साधारण विकल्प है?यदि मैं SQL कथन

select table_name from user_tab_columns 
where table_name = myTable and column_name = myColumn; 

मैं फिर परीक्षण कर रहा हूं कि प्रश्न साबित करने के लिए क्वेरी कुछ भी लौटाती है या नहीं।

मुझे पता है कि psql का उपयोग करके मैं इन्हें व्यक्तिगत रूप से ढूंढ सकता हूं लेकिन इसके परिणामस्वरूप एक प्रोग्राम में परिणाम उत्पन्न करना आवश्यक है जिसे मैं सत्यापित करने के लिए लिख रहा हूं कि एक अनुरोधित विशेषता फ़ील्ड मेरी डेटाबेस तालिका में मौजूद है।

उत्तर

75

इस प्रयास करें:

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column'; 
+0

धन्यवाद। उत्तर के रूप में स्वीकृत क्योंकि यह ओरेकल में जो कर रहा था उसके लिए एक सीधा विकल्प है। – CSharpened

+0

MySQL पर उसी तरह काम करता है, जो अच्छा है – Evgeny

+0

@CSharpened ओरेकल के लिए क्वेरी क्या है? – Evgeny

3
SELECT attname 
FROM pg_attribute 
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') 
AND attname = 'YOURCOLUMNNAME'; 

बेशक , YOURTABLENAME और उचित मूल्यों के साथ YOURCOLUMNNAME बदलें। यदि कोई पंक्ति वापस आती है, तो उस नाम वाला एक कॉलम मौजूद है, अन्यथा यह नहीं है।

+0

प्रतिक्रिया के लिए धन्यवाद। यद्यपि आपका उदाहरण ठीक काम करता है, मैंने अपनी सादगी के कारण रामदीप के जवाब को स्वीकार करने का विकल्प चुना है और तथ्य यह है कि यह मेरे मुद्दे के लिए एक और अधिक प्रत्यक्ष विकल्प प्रतीत होता है। – CSharpened

3

ओरेकल के विपरीत, पोस्टग्रेएसक्यूएल एएनएसआई मानक INFORMATION_SCHEMA विचारों का समर्थन करता है।

Oracle की user_tab_columns करने के लिए इसी मानक दृश्य है information_schema.columns

http://www.postgresql.org/docs/current/static/infoschema-columns.html

13

यह PostgreSQL के object identifier types साथ सरल (और SQLi-सुरक्षित) है:

SELECT TRUE 
FROM pg_attribute 
WHERE attrelid = 'myTable'::regclass -- cast to a registered class (table) 
AND attname = 'myColumn' 
AND NOT attisdropped -- exclude dropped (dead) columns 
-- AND attnum > 0  -- exclude system columns (you may or may not want this) 

significance of the columns in the manual के बारे में पढ़ें। search_path बाहर तालिकाओं के लिए

... 
AND attname = quote_ident('myColumn'); 

काम करता है, भी:

आप गतिशील एसक्यूएल निर्माण कर रहे हैं और अपने स्तंभ नाम पैरामीटर के रूप में आपूर्ति की जाती है, तो आप quote_ident() उपयोग करने के लिए एसक्यूएल इंजेक्शन से बचने के लिए चाहते हो सकता है

... 
WHERE attrelid = 'mySchema.myTable'::regclass 
... 
16

स्वीकृत जवाब सही है, लेकिन स्कीमा और अच्छे उत्पादन मिल रहा है (सही/गलत):

SELECT EXISTS (SELECT 1 
FROM information_schema.columns 
WHERE table_schema='my_schema' AND table_name='my_table' AND column_name='my_column'); 
0

यहां इरविन ब्रांडस्टेटर उत्तर का एक समान संस्करण है। यहां हम स्कीमा की जांच भी करते हैं यदि हमारे पास अलग-अलग स्कीमा में समान सारणी हों।

SELECT TRUE FROM pg_attribute 
WHERE attrelid = (
    SELECT c.oid 
    FROM pg_class c 
    JOIN pg_namespace n ON n.oid = c.relnamespace 
    WHERE 
     n.nspname = CURRENT_SCHEMA() 
     AND c.relname = 'YOURTABLENAME' 
    ) 
AND attname = 'YOURCOLUMNNAME' 
AND NOT attisdropped 
AND attnum > 0 
संबंधित मुद्दे