2013-03-12 6 views
7

कुछ जोड़ों को डीबग करने का प्रयास करना जो कार्टेशियन उत्पादों को लौटने के लिए लग रहा था, मैंने चयन में बराबर स्थिति को टाइप किया।क्या यह एक वैध SQL सशर्त अभिव्यक्ति या एक MySQL बग (सुविधा) है?

MySQL

select * 
from table 
where columnname 

में के रूप में यद्यपि मैं where columname is not null टाइप किया व्यवहार करने लगता है। टाइपिंग में शामिल होने में on table.columnname स्वीकार किया जाता है लेकिन पंक्तियों के बहुत सारे रिटर्न देता है। MySQL सही काम करता है अगर मैं इसे on table1.column=table2.column पर सही करता हूं लेकिन निश्चित रूप से मेरा पहला संस्करण गलत और अवैध था।

+3

संभावित रूप से यह 'कॉलमनाम' में मूल्य को बुलियन तक रखता है और उन पंक्तियों को वापस करता है जहां यह सत्य का मूल्यांकन करता है। –

+3

@ मार्टिनस्मिथ: MySQL में असली बूलियन डेटाटाइप नहीं है। यह बस हर नंबर का इलाज करता है जो शून्य के रूप में शून्य नहीं है। वहां 'foo से हटाएं जहां 42' अमान्य वाक्यविन्यास के बारे में शिकायत किए बिना आपकी तालिका में सभी पंक्तियों को खुशी से हटा देगा। –

+1

@a_horse_with_no_name - तारों के बारे में क्या? क्या उन्हें हमेशा '' 1 'के अलावा' झूठी 'के रूप में माना जाता है? ऐसा लगता है कि [इस एसक्यूएल फिडल] (http://sqlfiddle.com/#!2/c252c/2) –

उत्तर

1

अधिकांश प्रोग्रामिंग भाषाएं शून्य, 0, '' के रूप में सभी मानों को सही मानती हैं। जबकि (1); चाहे आप 1,2, 'ए', सच और इसी तरह के हों, चाहे एक अनंत लूप है। मैं इसे एक डिफ़ॉल्ट अपेक्षित व्यवहार कहूंगा और मैंने अक्सर इसी तरह प्रयोग किया है जहां क्लॉज

+0

विशेष रूप से, एक शर्त के रूप में संदर्भित होने पर, SQL शून्य में अंतर्निहित रूप से झूठ डाला जाता है। –

2

जिन संदर्भों के बारे में आप बात कर रहे हैं, WHERE खंड और ON खंड में शामिल होने के लिए, बस एक अभिव्यक्ति स्वीकार करें।

SELECT ... 
FROM table1 JOIN table2 ON <expr> 
WHERE <expr> 

भाव = तरह तुलना ऑपरेटरों शामिल कर सकते हैं लेकिन भाव भी एक एकल स्तंभ या एक ही निरंतर मूल्य के रूप में सरल हो सकता है।

किसी अन्य संदर्भ के साथ तुलना करें जो अभिव्यक्ति स्वीकार करता है: चयन-सूची।

SELECT <expr>, <expr>, <expr> 

इस संदर्भ में अभिव्यक्ति के रूप में एक कॉलम का उपयोग करना सामान्य है।

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