2010-11-02 13 views
14

मुझे पता है किएसक्यूएल लिस्टिंग सभी कॉलम नामों वर्णानुक्रम

SELECT * FROM Table 

तालिका के सभी कॉलम सूची जाएगा, लेकिन मैं वर्णमाला के क्रम में कॉलम लिस्टिंग में दिलचस्पी है।

कहें, मेरे पास तीन कॉलम हैं, "नाम", "आयु" और "लिंग"।

मैं कॉलम प्रारूप

|age| |name| |sex| 

में आयोजित यह एसक्यूएल के साथ ऐसा करना संभव है करना चाहते हैं?

उत्तर

12

हाँ, और कोई :-)

एसक्यूएल ही परवाह नहीं है क्या आदेश स्तंभों में बाहर आने लेकिन, आप का उपयोग करने के लिए गए थे, तो:

select age, name, sex from ... 

आप पाते हैं कि वे शायद उस क्रम में बाहर आया (हालांकि मुझे यकीन नहीं है कि एसक्यूएल मानकों को यह जरूरी है)।

अब आप नहीं चाहते हो सकता है ऐसा करने के लिए, लेकिन कभी कभी जीवन निष्पक्ष :-)

नहीं है तुम भी डीबीएमएस डेटा परिभाषा तालिकाओं का उपयोग गतिशील रूप से एक प्रश्न के निर्माण के लिए के अन्य संभावना है। यह गैर-पोर्टेबल है लेकिन अधिकांश डीबीएमएस 'इन तालिकाओं (जैसे डीबी/2 के SYSIBM.SYSCOLUMNS) की आपूर्ति करते हैं और आप आदेशित फैशन में कॉलम नामों का चयन कर सकते हैं। कुछ की तरह:

select column_name from sysibm.syscolumns 
where owner = 'pax' and table_name = 'movies' 
order by column_name; 

तो फिर तुम के परिणामों का प्रयोग कि क्वेरी वास्तविक क्वेरी के निर्माण के लिए:

query1 = "select column_name from sysibm.syscolumns" + 
     " where owner = 'pax' and table_name = 'movies'" + 
     " order by column_name" 
rs = exec(query1) 
query2 = "select" 
sep = " " 
foreach colm in rs: 
    query2 += sep + colm["column_name"] 
    sep = ", " 
query2 += " from movies order by rating" 
rs = exec(query2) 
// Now you have the rs recordset with sorted columns. 

हालांकि, अगर तुम सच में गंभीर रूप से सभी क्वेरी * चयन जांच करनी चाहिए - विशाल बहुमत में मामलों में, यह अनावश्यक और अक्षम है। और डेटा की प्रस्तुति कुछ ऐसा है जो संभवतः प्रस्तुति परत द्वारा किया जाना चाहिए, डीबीएमएस स्वयं नहीं - डेटा को यथासंभव कुशल तरीके से वापस करने के लिए डीबीएमएस छोड़ा जाना चाहिए।

+0

हम्म, मुझे लगता है कि मुझे स्ट्रिंग सॉर्टिंग करने की अच्छी पुरानी विधि का सहारा लेना है :) –

+1

मैं इसके साथ सहमत हूं, कभी भी उत्पादन कोड में * उपयोग नहीं करता हूं। उदाहरण के लिए सुरक्षा के लिए, जब आप बाद में किसी कॉलम को सूचीबद्ध नहीं करते हैं, तो आप कभी नहीं जानते हैं। केवल आवश्यक कॉलम लाने के लिए हमेशा क्वेरी बनाएं। और यदि आप इसे गतिशील रूप से ऐसा करना चाहते हैं, लेकिन अन्य डेवलपर्स को देखने के लिए यह बहुत स्पष्ट रूप से ध्यान दें। –

+0

एक और, यदि SQL दृश्यों का उपयोग करना * में अधिक दुष्प्रभाव हैं यदि अंतर्निहित तालिकाओं को बदल दिया गया है (नया या हटाया गया कॉलम) दृश्य अद्यतन नहीं होता है, तो यह नए कॉलम नहीं दिखा सकता है या मौजूदा कॉलम दृश्य दृश्य के रूप में बदला जा सकता है सूचकांक द्वारा कॉलम उनके निर्माण पर था। –

0

तुम बस कॉलम आप चयन करना चाहते हैं निर्दिष्ट कर सकते हैं:

SELECT age, name, sex FROM Table 

कॉलम उसी क्रम में दिखाया जाएगा के रूप में आप उन्हें क्वेरी में निर्दिष्ट।

+0

उत्तर के लिए धन्यवाद। असल में स्थिति ऐसी है कि, इतने सारे कॉलम लिखना कठिन होगा। यही कारण है कि मैं सोच रहा था कि एसक्यूएल क्वेरीज़ का उपयोग करके इसे सीधे करना संभव है। शायद कॉलम नामों को सूचीबद्ध करने और स्तंभ नामों को क्रमबद्ध करने के लिए बाहरी प्रोग्राम का उपयोग करने का एक विकल्प होगा। –

4
  • गतिशील एसक्यूएल के बिना स्वचालित रूप से ऐसा करने का कोई तरीका नहीं है।
  • SELECT * अनुशंसित नहीं है और स्तंभ नाम
  • सॉर्ट नहीं होंगे आप, स्पष्ट रूप से एसक्यूएल स्तर पर SELECT age, name, sex FROM

कर दिया था यह कोई बात नहीं। किसी भी क्लाइंट कोड ऑब्जेक्ट से कोई फर्क नहीं पड़ता-

यदि यह महत्वपूर्ण है, तो जब आप क्लाइंट को डेटा पेश करते हैं तो सॉर्ट करें।

क्षमा करें, यह वही तरीका है ...

3

एसक्यूएल-9 2 मानक निर्दिष्ट करता है कि SELECT * का उपयोग करते समय कॉलम को तालिका के भीतर अपनी सामान्य स्थिति के आरोही अनुक्रम में संदर्भित किया जाता है। प्रासंगिक खंड 4.8 (कॉलम) और 7.9 (क्वेरी विनिर्देश) हैं। मुझे मानक में किसी भी विक्रेता एक्सटेंशन के बारे में पता नहीं है जो कॉलम को किसी भी अन्य क्रम में वापस करने की अनुमति देगा, शायद SELECT * का उपयोग आमतौर पर निराश होता है।

आप एसक्यूएल डीडीएल का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि कॉलम की सामान्य स्थिति वांछित वर्णमाला क्रम से मेल खाती है। हालांकि, यह केवल FROM खंड में साइनज तालिका का संदर्भ देते समय आप जिस तरह से चाहते हैं उसमें काम करेंगे। यदि दो तालिकाओं का संदर्भ दिया जाता है, SELECT * क्रमिक स्थिति क्रम में पहली तालिका से कॉलम लौटाएगा, इसके बाद क्रमिक स्थिति में दूसरी तालिका के कॉलम होंगे, इसलिए पूर्ण परिणामसेट के कॉलम वर्णानुक्रम में नहीं हो सकते हैं।

9

यह चयनित कथन में वर्णानुक्रमित क्रमशः सभी कॉलम के साथ एक क्वेरी उत्पन्न करता है।

DECLARE @QUERY VARCHAR(2000) 
DECLARE @TABLENAME VARCHAR(50) = '<YOU_TABLE>' 

SET @QUERY = 'SELECT ' 
SELECT @QUERY = @QUERY + Column_name + ', 
' 
    FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @TABLENAME 
ORDER BY Column_name 

SET @QUERY = LEFT(@QUERY, LEN(@QUERY) - 4) + ' 
FROM '+ @TABLENAME 

PRINT @QUERY 
EXEC(@QUERY) 
+1

यह मानता है कि क्वेरी हमेशा विज्ञापन-प्रसार में चली जाएगी लेकिन यह भी एक अच्छा प्रारंभिक बिंदु है यदि पोस्टर गतिशील एसक्यूएल के साथ ठीक है। – RThomas

+2

मेरे लिए काम किया, इस संशोधन के साथ वाम कथन (लेन) - 4 से -1 – Brian

संबंधित मुद्दे