PostgreSQL में INऔर ANYऑपरेटर में क्या अंतर है ?
दोनों की कार्य प्रणाली एक समान प्रतीत होती है। क्या कोई इसे एक उदाहरण के साथ समझा सकता है?
PostgreSQL में INऔर ANYऑपरेटर में क्या अंतर है ?
दोनों की कार्य प्रणाली एक समान प्रतीत होती है। क्या कोई इसे एक उदाहरण के साथ समझा सकता है?
जवाबों:
(न तो "ऑपरेटर" है INऔर न ही ANY"निर्माण" या "सिंटैक्स तत्व"।)
तार्किक रूप से , मैनुअल को उद्धृत करते हुए :
INके बराबर है= ANY।
लेकिन वहाँ दो हैं वाक्य रचना वेरिएंट की INऔर के दो वेरिएंट ANY। विवरण:
IN एक लेने सेट के बराबर है = ANYएक लेने सेट के रूप में यहाँ का प्रदर्शन किया,:
लेकिन प्रत्येक का दूसरा संस्करण दूसरे के बराबर नहीं है। ANYनिर्माण का दूसरा संस्करण एक सरणी लेता है (वास्तविक सरणी प्रकार होना चाहिए), जबकि दूसरा संस्करण मानों कीIN अल्पविराम से अलग सूची लेता है । इससे पासिंग वैल्यू में अलग-अलग प्रतिबंध लग सकते हैं और विशेष मामलों में अलग-अलग क्वेरी प्लान भी हो सकते हैं:
=any()लेकिन इसके साथ प्रयोग किया जाता हैinANY अधिक बहुमुखी हैANYके रूप में यह विभिन्न ऑपरेटरों, न कि केवल साथ जोड़ा जा सकता निर्माण, कहीं अधिक बहुमुखी है =। उदाहरण:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
मूल्यों की एक बड़ी संख्या के लिए, प्रत्येक के लिए बेहतर एक सेट तराजू प्रदान करना :
सम्बंधित:
"जहां पंक्ति idदी गई सरणी में है, वहां खोजें ":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
उलट: "पंक्तियों जहां का पता लगाएं idहै नहीं सरणी में":
SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}'); -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
तीनों बराबर। एरे कंस्ट्रक्टर के साथ पहला , एरे शाब्दिक के साथ अन्य दो । डेटा प्रकार को संदर्भ से स्पष्ट रूप से प्राप्त किया जा सकता है। और, एक स्पष्ट कलाकार की आवश्यकता हो सकती है, जैसे '{1,2}'::int[]।
पंक्तियों के साथ id IS NULLइनमें से कोई भी भाव नहीं है। NULLमूल्यों को अतिरिक्त रूप से शामिल करना:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
SELECT * from mytable where id in (1, 2, 3)हमेशा समान पंक्तियों में परिणाम होगा SELECT * from mytable where id = ANY('{1, 2, 3}'), भले ही वे संभावित रूप से अलग-अलग क्वेरी योजनाएं हों।
ANY !=ऑपरेटर के साथ नहीं जोड़ा जा सकता । मुझे नहीं लगता कि यह प्रलेखित है, लेकिन select * from foo where id != ANY (ARRAY[1, 2])जैसा है वैसा नहीं है select * from foo where id NOT IN (1, 2)। दूसरी ओर, select * from foo where NOT (id = ANY (ARRAY[1, 2]))उम्मीद के मुताबिक काम करता है।
ANYसाथ जोड़ा जा सकता है !=। लेकिन इसके साथ बहुत कुछ है। मैंने ऊपर एक अध्याय जोड़ा। (ध्यान दें कि <>मानक एसक्यूएल में ऑपरेटर है - हालांकि !=पोस्टग्रैस में भी स्वीकार किया जाता है।)
NULLमान शामिल हैं, वह कैसे काम करता है ? WHERE id = ANY (ARRAY[1, 2]) OR id IS NULL;साथ ही काम करेगा ?
(id = ...) IS NOT TRUEकाम करता है क्योंकि id = ...केवल मूल्यांकन करता है कि TRUEक्या कोई वास्तविक मैच है। परिणाम FALSEया NULLहमारी परीक्षा उत्तीर्ण। देखें: stackoverflow.com/a/23767625/939860 । आपकी जोड़ी गई अभिव्यक्ति कुछ और के लिए परीक्षण करती है। यह समतुल्य होगाWHERE id <> ALL (ARRAY[1, 2]) OR id IS NULL;
दो स्पष्ट बिंदु हैं, साथ ही अन्य उत्तर में अंक भी हैं:
उप प्रश्नों का उपयोग करते समय वे बिल्कुल बराबर होते हैं:
SELECT * FROM table
WHERE column IN(subquery);
SELECT * FROM table
WHERE column = ANY(subquery);दूसरी ओर:
केवल INऑपरेटर एक साधारण सूची की अनुमति देता है:
SELECT * FROM table
WHERE column IN(… , … , …);यह मानते हुए कि वे वास्तव में एक ही हैं मुझे कई बार पकड़ा है जब भूल जाते हैं कि ANYसूचियों के साथ काम नहीं करता है।