मैजिक कॉलम "नाम" कहां से आता है?


11

मुझे यह दुर्घटना से मिला:

db=> select name from site;
ERROR:  column "name" does not exist
LINE 1: select name from site;
               ^
db=> select site.name from site;
     name
---------------
 (1,mysitename)
(1 row)

दूसरी क्वेरी पूरी पंक्ति वाली एक टपल लौटाती है। पोस्टग्रेज का उपयोग 9.0.1।

संपादित करें: अनुरोध द्वारा साइट की परिभाषा। मैं वास्तव में कोई फर्क नहीं पड़ता, यह quirk किसी भी तालिका के लिए काम करता है।

db=> \d site
                         Table "public.site"
 Column |  Type   |                     Modifiers
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('site_id_seq'::regclass)
 title  | text    | not null

यह परिभाषा दिखाने में मदद करेगा site
पीटर आइजेंट्रूट

~ यह मायने रखता है क्योंकि अब हम देख सकते हैं कि siteशुरू करने के लिए कोई "नाम" नहीं है । आप उस कॉलम के लिए क्वेरी क्यों करेंगे जो मौजूद नहीं है?
jcolebrand

1
कोशिश करें select site from site- इससे आपको गयुस के उत्तर को और अधिक विस्तार से समझने में मदद मिलेगी
जैक कहते हैं कि topanswers.xyz की कोशिश करें

जवाबों:


11

NAMEवास्तव में एक समारोह है । यह Postgres का एक क्विक है कि एक तर्क जैसे एक फ़ंक्शन function(arg)को भी कहा जा सकता है arg.function। डॉक्स से:

कार्यात्मक संकेतन और विशेषता संकेतन के बीच समानता "कम्प्यूटेड फ़ील्ड्स" का अनुकरण करने के लिए मिश्रित प्रकारों पर कार्यों का उपयोग करना संभव बनाती है।

NAMEऑब्जेक्ट नामों के लिए एक आंतरिक प्रकार है , और यह फ़ंक्शन उस प्रकार के लिए अपना तर्क दे रहा है और इसे वापस कर रहा है।


धन्यवाद, मुझे नहीं पता था कि। क्या मुझे परेशान करता है, अगर यह विशेष फ़ंक्शन "नाम" कहीं भी प्रलेखित है?
hegemon

मेरा जवाब अपडेट किया गया
Gaius

2
अधिक सटीक रूप से, rowटाइप किया जा रहा है textक्योंकि यह फ़ंक्शन का इनपुट प्रकार है namenameसमारोह फिर रूपांतरण से है (नहीं कास्टिंग) प्रकार के लिए इनपुट स्ट्रिंग name(जो भी 64 बाइट्स छोटा के पक्ष प्रभाव पड़ेगा)
जैक topanswers.xyz कोशिश कहते हैं

3

यह भी ध्यान दें कि नाम में निहित कलाकारों को PostgreSQL 8.3 में हटा दिया गया था, जिसका अर्थ है कि यह व्यवहार अब काम नहीं करता है। वस्तुतः PostgreSQL 8.3 और उच्चतर में इस व्यवहार को प्राप्त करना लगभग असंभव है क्योंकि ट्यूपल स्वचालित रूप से पाठ में परिवर्तित नहीं होते हैं।

तो 9.1 में:

or_examples=# select c.name from comp_table_test c;
ERROR:  column c.name does not exist
LINE 1: select c.name from comp_table_test c;

लेकिन उस व्यवहार को पाने के लिए हमें:

or_examples=# select name(c::text) from comp_table_test c;

या हम अपने खुद के नाम फ़ंक्शन को comp_table_test में लेने और जो कुछ भी हम चाहते हैं उसे वापस परिभाषित कर सकते हैं।


मुझे यह उत्तर समझ में नहीं आता है। आप कह रहे हैं कि ऊपर प्रस्तुत प्रश्न 8.3 या उच्चतर पर कोई समस्या नहीं होनी चाहिए? फिर भी सवाल 9.0
कॉलिन के टी हार्ट

0

"नाम" एक आरक्षित कुंजी शब्द है । इसलिए आपको इसका उपयोग करने के लिए कीवर्ड को "उद्धरण" देना चाहिए:

SELECT "name" FROM site;

इससे अतीत में मेरे लिए इन मुद्दों में से कुछ हल हो गए हैं, आपके द्वारा पोस्ट किए गए कोड को भी उद्धृत किए बिना काम करना चाहिए। दूसरी ओर

select site.name from site;

शब्द क्योंकि आप कॉलम के नाम को हल करने के लिए स्कीमा का स्पष्ट रूप से उपयोग कर रहे हैं


1
बहुत सारे आरक्षित शब्दों का उपयोग किया जा सकता है, और इस मामले में यह उद्धृत करने से मदद नहीं मिलती है। ऐसा इसलिए है क्योंकि यदि साइट .name कॉलम के रूप में मौजूद नहीं है, तो पूर्व-8.3, क्या होगा आप साइट डेटा प्रकार या साइट से अनुमानित रूप से टाइप किए गए नाम के कार्यों की तलाश शुरू करेंगे । चूँकि साइट को टेक्स्ट में निहित किया जा सकता है, इसलिए नाम (टेक्स्ट) का उपयोग किया जाएगा। नतीजतन select site.name from siteयह स्पष्ट रूप से रूपांतरित हो सकता select name(site::text) from siteहै कि जादू कहाँ से आता है।
क्रिस ट्रैवर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.