(न तो IN
न ही ANY
एक "ऑपरेटर" है। एक "निर्माण" या "वाक्यविन्यास तत्व"।)
तार्किक रूप से , मैनुअल को उद्धृत करते हुए:
<ब्लॉकक्वॉट>
IN
= ANY
. के बराबर है ।
लेकिन दो वाक्यविन्यास प्रकार हैं का IN
और ANY
. के दो प्रकार . विवरण:
- रेल के साथ WHERE क्लॉज में IN के बजाय Any का उपयोग कैसे करें?
IN
एक सेट लेना = ANY
. के बराबर है एक सेट लेना , जैसा कि यहां दिखाया गया है:
- postgreSQL - बनाम किसी में
लेकिन प्रत्येक का दूसरा संस्करण दूसरे के बराबर नहीं है। ANY
. का दूसरा संस्करण निर्माण एक सरणी takes लेता है (एक वास्तविक सरणी प्रकार होना चाहिए), जबकि IN
. का दूसरा संस्करण अल्पविराम से अलग किए गए मानों की सूची लेता है . यह मूल्यों को पारित करने में विभिन्न प्रतिबंधों की ओर जाता है और कर सकता है विशेष मामलों में अलग-अलग क्वेरी योजनाओं की ओर भी ले जाता है:
- इंडेक्स
=any()
के साथ प्रयोग नहीं किया गया लेकिनin
. के साथ प्रयोग किया जाता है - किसी फ़ंक्शन में कई सेट या मानों की सरणियों को पास करें
- समग्र प्रकार की सरणी में तत्वों का मिलान कैसे करें?
ANY
अधिक बहुमुखी है
ANY
निर्माण कहीं अधिक बहुमुखी है, क्योंकि इसे विभिन्न ऑपरेटरों के साथ जोड़ा जा सकता है, न कि केवल =
. उदाहरण:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
बड़ी संख्या में मानों के लिए, एक सेट . प्रदान करना प्रत्येक के लिए बेहतर पैमाना:
- पोस्टग्रेज क्वेरी को बड़े IN के साथ ऑप्टिमाइज़ करना
संबंधित:
- क्या PostgreSQL सरणी स्तंभों को अनुक्रमित कर सकता है?
उलटा / विपरीत / बहिष्करण
"पंक्तियां ढूंढें जहां 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;