PostgreSQL में IN
और ANY
ऑपरेटर में क्या अंतर है ?
दोनों की कार्य प्रणाली एक समान प्रतीत होती है। क्या कोई इसे एक उदाहरण के साथ समझा सकता है?
PostgreSQL में IN
और ANY
ऑपरेटर में क्या अंतर है ?
दोनों की कार्य प्रणाली एक समान प्रतीत होती है। क्या कोई इसे एक उदाहरण के साथ समझा सकता है?
जवाबों:
(न तो "ऑपरेटर" है IN
और न ही ANY
"निर्माण" या "सिंटैक्स तत्व"।)
तार्किक रूप से , मैनुअल को उद्धृत करते हुए :
IN
के बराबर है= ANY
।
लेकिन वहाँ दो हैं वाक्य रचना वेरिएंट की IN
और के दो वेरिएंट ANY
। विवरण:
IN
एक लेने सेट के बराबर है = ANY
एक लेने सेट के रूप में यहाँ का प्रदर्शन किया,:
लेकिन प्रत्येक का दूसरा संस्करण दूसरे के बराबर नहीं है। ANY
निर्माण का दूसरा संस्करण एक सरणी लेता है (वास्तविक सरणी प्रकार होना चाहिए), जबकि दूसरा संस्करण मानों कीIN
अल्पविराम से अलग सूची लेता है । इससे पासिंग वैल्यू में अलग-अलग प्रतिबंध लग सकते हैं और विशेष मामलों में अलग-अलग क्वेरी प्लान भी हो सकते हैं:
=any()
लेकिन इसके साथ प्रयोग किया जाता हैin
ANY
अधिक बहुमुखी है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
सूचियों के साथ काम नहीं करता है।