2015-11-24 9 views
5

ठीक है, यह शायद ओरेकल पार्सर की एक quirkiness है।ओरेकल में एक स्ट्रिंग मान को स्वीकार करने से पहले प्लस साइन (+) क्यों है?

निम्न क्वेरी काम करता है। अंतिम पंक्ति पर 'वाई' से पहले + पर ध्यान दें।

SELECT * 
    FROM (SELECT 'Y' AS field FROM DUAL 
     UNION ALL 
     SELECT 'X' AS field FROM DUAL) t 
WHERE t.field = +'Y' 

ओरेकल पार्सर इसे स्वीकार क्यों कर रहा है? एक सेकंड के लिए मैंने सोचा कि यह पुराने बाहरी वाक्यविन्यास में शामिल होने के कारण था, लेकिन उस वाक्यविन्यास में + कोष्ठक से घिरा हुआ है।

यह रूप में अच्छी तरह से काम करता है:

select +'Y1' from dual; 

और इस:

select 'A' || + 'Y1' from dual; 

यह काम करता है (ओरेकल एक नंबर करने के स्ट्रिंग धर्मान्तरित):

select -'1' from DUAL; 

लेकिन यह नहीं ([ त्रुटि] निष्पादन (223: 9): ओआरए -01722: अमान्य संख्या ):

select -'A' from DUAL; 

मुझे आश्चर्य है कि क्यों + वर्चर 2 मान से पहले उपयोग किया जा सकता है। Arithmetic Operators अनुभाग विशिष्ट नियमों का उल्लेख नहीं करता है जो स्ट्रिंग मानों पर लागू होंगे।

+0

मजेदार। पार्सर सिर्फ पारदर्शी है इसलिए यह डेटा प्रकारों पर विचार नहीं करता है और + मान्य अभिव्यक्ति है। यह भी अनुकूलन हो सकता है जो लागू होता है क्योंकि यूनरी + अभिव्यक्ति को संशोधित नहीं करता है और इसे अनुकूलित किया जा सकता है। बस 'चयन - - 1 से डुएल' की जांच की गई और यह व्याकरणिक रूप से गलत है हालांकि मेटामैटिकली सही है। – Husqvik

+0

@ हुस्कविक, यह मजाकिया है। अंकगणितीय ऑपरेटरों पृष्ठ ओपी लिंक में डबल अस्वीकृति के लिए '--' के खिलाफ चेतावनी है, क्योंकि यह एक टिप्पणी शुरू करता है। एक जगह या माता पिता के साथ अलग करने के लिए कहते हैं। –

+0

@ हुस्कविक: जब मैंने पार्सर कहा तो मुझे वास्तव में पूरे स्टैक, पार्सर, कंपाइलर, ऑप्टिमाइज़र आदि का मतलब था। हाँ + मान्य है। मैंने दोहरी कार्यों से -1 - चयन का विचार किया होगा। - 1 सी #, जावास्क्रिप्ट और जावा में मान्य है लेकिन स्कैला में नहीं है। – costa

उत्तर

5

एकल + ऑपरेटर पहचान के रूप में परिभाषित किया गया हैAbout SQL Operators में Table 4-1 "SQL Operator Precedence" देखें।

इसके अलावा:

select + date '2015-01-01' from dual; 

जनवरी 01 2015 00:00:00


संपादित जोड़ने के लिए।

"पहचान" अपने तर्क को वापस करने के लिए। एक अलग भाषा से दूसरे उदाहरण के लिए क्लोजर का identity फ़ंक्शन देखें। विकिपीडिया में "identity function" के लिए एक पृष्ठ है।

+1

इस संदर्भ में पहचान का अर्थ क्या है? – costa

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