आपको अपने किसी भी कोड में तालिका में कॉलम नंबर पर लगभग कभी भी भरोसा नहीं करना चाहिए (भले ही आप सैद्धांतिक रूप से तकनीकी रूप से ऐसा कर सकते हैं)।
कई कारण हैं, सबसे महत्वपूर्ण में से एक यह है कि कोई व्यक्ति हमेशा तालिका को बदल सकता है और आपके कोड को पूरी तरह से तोड़ते हुए शुरुआत / मध्य में एक कॉलम सम्मिलित कर सकता है।
दूसरा कारण यह है कि कॉलम की स्थिति - भले ही आप मान लें कि तालिका कभी नहीं बदलती है - पूरी तरह से अपठनीय बनाएं और इसलिए कोड को बनाए रखना असंभव है। क्या आपको याद होगा कि कॉलम 13 अब से 2 साल बाद "last_name_3" था?
कृपया ध्यान दें कि यदि आपकी समस्या यह है कि उदाहरण के लिए आपके पास SELECT fn11, fn12, fn13, ... fn32
जैसा कुछ है आपके कोड में, और आपको लगता है कि fn11..fn32 की स्पेलिंग एक ड्रैग है, आप न केवल 100% सही हैं, बल्कि आपको पर्ल मुहावरों के माध्यम से उक्त ड्रैग को पूरी तरह से हटा देना चाहिए:"SELECT " . join(", ", map { "fn$_" } (11..32));
ऐसा कहने के बाद, यदि आप यह जानना चाहते हैं कि इसे सैद्धांतिक रूप से कैसे करना है, जैसे कि "कूल तकनीकी चाल" अभ्यास के रूप में, मुझे डीबीआई के माध्यम से इसे सामान्य रूप से करने का एक अच्छा तरीका नहीं पता है, लेकिन आप इसे आमतौर पर डेटाबेस में कर सकते हैं- विशिष्ट तरीका।
ऐसा करने के लिए, आपको ध्यान देना चाहिए कि:
-
बहुत सारे सभी डेटाबेस किसी प्रकार के "टेबल बनाएं" कथन के माध्यम से टेबल बनाते हैं जो कॉलम की ऑर्डर की गई सूची लेता है (अधिकांश रिलेशनल डेटाबेस वास्तव में उस क्रम में पंक्ति में मूल्यों को भौतिक रूप से संग्रहीत करते हैं, इसलिए यह महत्वपूर्ण है - भले ही सैद्धांतिक संबंधपरक कैलकुस कॉलम को ऑर्डर के रूप में मानता है- कम जैसा मार्कोग ने कहा)।
-
बहुत सारे सभी डेटाबेस में एक विशेष तालिका होती है जो सूचीबद्ध करती है कि कौन सी तालिका में कौन से कॉलम हैं (
syscolumns
Sybase में,INFORMATION_SCHEMA.COLUMNS
MySQL में), और उस तालिका में एक कॉलम की संख्यात्मक आईडी होती है जिसका उपयोग उन्हें "क्रिएट" ऑर्डर के समान ऑर्डर करने के लिए किया जाता है; या यहां तक कि विशेष "आदेश" फ़ील्ड (उदा.ORDINAL_POSITION
MySQL में मान)।तो, आप कर सकते हैं - समय से पहले - अपनी इच्छित तालिका और उनके आदेश के लिए कॉलम की ऑर्डर की गई सूची को क्वेरी करें। MySQL के लिए क्वेरी करने के लिए,
SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"
. डेटा को @columns सूची में संग्रहीत करें (या यदि आपके पास कई टेबल हैं, तो सरणी का हैश,% कॉलम, तालिका नाम कुंजी के साथ)।फिर, कोई प्रश्न बनाते समय, आप बस इतना कहते हैं
"select $columns{table1}->[11],$columns{table1}->[13], ...."
कृपया ध्यान दें कि वास्तविक सर्वर को भेजे गए SQL में कॉलम नाम होंगे, लेकिन आप उन नामों को अपने कोड में कहीं भी हार्ड-कोड नहीं करेंगे।