PostgreSQL में किसी भी ऑपरेटर में बनाम


119

PostgreSQL में INऔर ANYऑपरेटर में क्या अंतर है ?
दोनों की कार्य प्रणाली एक समान प्रतीत होती है। क्या कोई इसे एक उदाहरण के साथ समझा सकता है?



क्या इससे आपके सवाल का जवाब मिलता है? और sql में किसी भी ऑपरेटर के बीच अंतर
फिलीपिक्‍स

जवाबों:


158

(न तो "ऑपरेटर" है INऔर न ही ANY"निर्माण" या "सिंटैक्स तत्व"।)

तार्किक रूप से , मैनुअल को उद्धृत करते हुए :

INके बराबर है = ANY

लेकिन वहाँ दो हैं वाक्य रचना वेरिएंट की INऔर के दो वेरिएंट ANY। विवरण:

IN एक लेने सेट के बराबर है = ANYएक लेने सेट के रूप में यहाँ का प्रदर्शन किया,:

लेकिन प्रत्येक का दूसरा संस्करण दूसरे के बराबर नहीं है। 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;

4
यह स्पष्ट रूप से स्पष्ट करना अच्छा होगा कि दूसरे वेरिएंट के परिणाम हमेशा समान होंगे। मुझे 99% यकीन है कि वास्तव में यह मामला है, लेकिन जवाब यह नहीं लगता है। इसका अर्थ है कि SELECT * from mytable where id in (1, 2, 3)हमेशा समान पंक्तियों में परिणाम होगा SELECT * from mytable where id = ANY('{1, 2, 3}'), भले ही वे संभावित रूप से अलग-अलग क्वेरी योजनाएं हों।
केपीडी

1
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]))उम्मीद के मुताबिक काम करता है।

1
@qris: ऑपरेटर के ANYसाथ जोड़ा जा सकता है !=। लेकिन इसके साथ बहुत कुछ है। मैंने ऊपर एक अध्याय जोड़ा। (ध्यान दें कि <>मानक एसक्यूएल में ऑपरेटर है - हालांकि !=पोस्टग्रैस में भी स्वीकार किया जाता है।)
इरविन ब्रांडस्टेटर

अंतिम संस्करण जिसमें NULLमान शामिल हैं, वह कैसे काम करता है ? WHERE id = ANY (ARRAY[1, 2]) OR id IS NULL;साथ ही काम करेगा ?
4

1
@dvtan: (id = ...) IS NOT TRUEकाम करता है क्योंकि id = ...केवल मूल्यांकन करता है कि TRUEक्या कोई वास्तविक मैच है। परिणाम FALSEया NULLहमारी परीक्षा उत्तीर्ण। देखें: stackoverflow.com/a/23767625/939860 । आपकी जोड़ी गई अभिव्यक्ति कुछ और के लिए परीक्षण करती है। यह समतुल्य होगाWHERE id <> ALL (ARRAY[1, 2]) OR id IS NULL;
इरविन ब्रांडस्टेटर

3

दो स्पष्ट बिंदु हैं, साथ ही अन्य उत्तर में अंक भी हैं:

  • उप प्रश्नों का उपयोग करते समय वे बिल्कुल बराबर होते हैं:

    SELECT * FROM table
    WHERE column IN(subquery);
    
    SELECT * FROM table
    WHERE column = ANY(subquery);

दूसरी ओर:

  • केवल INऑपरेटर एक साधारण सूची की अनुमति देता है:

    SELECT * FROM table
    WHERE column IN(… ,  , …);

यह मानते हुए कि वे वास्तव में एक ही हैं मुझे कई बार पकड़ा है जब भूल जाते हैं कि ANYसूचियों के साथ काम नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.