IN
. के दो प्रकार हैं भाव:
expression IN (subquery)
expression IN (value [, ...])
इसी तरह, ANY
. के साथ दो प्रकार निर्माण:
expression operator ANY (subquery)
expression operator ANY (array expression)
एक सबक्वेरी किसी भी तकनीक के लिए काम करती है, लेकिन सेकंड . के लिए काम करती है प्रत्येक का रूप, IN
मानों की सूची . की अपेक्षा करता है (जैसा कि मानक SQL में परिभाषित किया गया है) जबकि = ANY
एक सरणी . की अपेक्षा करता है ।
किसका उपयोग करें?
ANY
बाद में, अधिक बहुमुखी जोड़ है, इसे किसी भी बाइनरी ऑपरेटर के साथ जोड़ा जा सकता है जो बूलियन मान लौटाता है। IN
ANY
. के एक विशेष मामले में जल जाता है . वास्तव में, इसका दूसरा रूप आंतरिक रूप से फिर से लिखा जाता है:
IN
= ANY
. के साथ फिर से लिखा जाता है NOT IN
<> ALL
. के साथ फिर से लिखा जाता है
EXPLAIN
की जांच करें अपने लिए देखने के लिए किसी भी प्रश्न के लिए आउटपुट। इससे दो बातें साबित होती हैं:
IN
= ANY
. से तेज कभी नहीं हो सकता ।= ANY
काफी तेज नहीं होने जा रहा है।
पसंद का निर्णय क्या प्रदान करना आसान है . द्वारा किया जाना चाहिए :मानों या एक सरणी की सूची (संभवतः सरणी शाब्दिक के रूप में - एक एकल मान)।
यदि आप जिन आईडी को पास करने जा रहे हैं वे DB के भीतर से come आती हैं वैसे भी, उन्हें सीधे (सबक्वेरी) चुनना या JOIN
के साथ क्वेरी में स्रोत तालिका को एकीकृत करना कहीं अधिक कुशल है (जैसे @mu ने टिप्पणी की)।
लंबी सूची pass पास करने के लिए अपने क्लाइंट से मूल्यों का और सर्वोत्तम प्रदर्शन get प्राप्त करें , एक सरणी का उपयोग करें, unnest()
और शामिल हों, या इसे VALUES
. का उपयोग करके तालिका अभिव्यक्ति के रूप में प्रदान करें (जैसे @PinnyM ने टिप्पणी की)। लेकिन ध्यान दें कि एक JOIN
संभव डुप्लिकेट को सुरक्षित रखता है प्रदान की गई सरणी / सेट में IN
. के दौरान या = ANY
ऐसा न करें। अधिक:
- पोस्टग्रेज क्वेरी को बड़े IN के साथ ऑप्टिमाइज़ करना
NULL मानों की उपस्थिति में, NOT IN
अक्सर गलत विकल्प होता है और NOT EXISTS
सही होगा (और तेज़ भी):
- उन पंक्तियों का चयन करें जो अन्य तालिका में मौजूद नहीं हैं
= ANY
के लिए सिंटैक्स
सरणी अभिव्यक्ति के लिए Postgres स्वीकार करता है:
- एक सरणी निर्माता (सरणी पोस्टग्रेज पक्ष पर मूल्यों की एक सूची से निर्मित है) फ़ॉर्म के:
ARRAY[1,2,3]
- या सरणी शाब्दिक फ़ॉर्म का
'{1,2,3}'
।
अमान्य प्रकार के कास्ट से बचने के लिए, आप स्पष्ट रूप से कास्ट कर सकते हैं:
ARRAY[1,2,3]::numeric[]
'{1,2,3}'::bigint[]
संबंधित:
- PostgreSQL:प्रक्रिया के लिए सरणी पास करने के साथ समस्या
- पोस्टग्रेज फ़ंक्शन के लिए कस्टम प्रकार सरणी कैसे पास करें
या आप कर सकते थे VARIADIC
taking लेते हुए एक Postgres फ़ंक्शन बनाएं पैरामीटर, जो अलग-अलग तर्क लेता है और उनसे एक सरणी बनाता है:
- एकल पैरामीटर में कई मान पास करना
रूबी से सरणी कैसे पास करें?
मान लें कि id
integer
होना :
MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})
लेकिन मैं सिर्फ रूबी में डबिंग कर रहा हूं। @mu इस संबंधित उत्तर में विस्तृत निर्देश प्रदान करता है:
- रूबी में sql क्वेरी के लिए मानों की सरणी भेजना?