PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

रेल के साथ WHERE क्लॉज में IN के बजाय किसी का उपयोग कैसे करें?

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 क्वेरी के लिए मानों की सरणी भेजना?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में JSONB का उपयोग करना:PostgreSQL में JSON डेटा को प्रभावी ढंग से कैसे स्टोर और इंडेक्स करें?

  2. किस प्रकार के जॉइन का उपयोग करना है

  3. सबसे अच्छा PostgreSQL GUI कौन सा है? 2021 तुलना

  4. INSERT ... ON CONFLICT ... के साथ सभी कॉलम कैसे अपडेट करें?

  5. PostgreSQL में SSL कैसे इनेबल करें