दिलचस्प पोस्ट
पांडा डेटाफ़्रेम में सूचियों की सूची प्राप्त करना IIS लॉग्स कहां मिल सकता है? चार * var के बीच का अंतर; और चार * var ;? कैसे WinDbg में प्रतीकों को सेट करने के लिए? इंस्टॉलेशन के ठीक बाद एक .नेट विंडोज सर्विस कैसे शुरू करें? सी ++ मल्टीचैरैक्टर शाब्दिक जावास्क्रिप्ट का प्रयोग करते हुए ब्राउज़र मौजूदा लोकेल प्राथमिकता प्राप्त करने के लिए कैसे? कैसे जावा में संघ, अंतर, अंतर और रिवर्स डेटा करते हैं जावा में एक ऑब्जेक्ट कब पहुंचा जा सकता है? डबल से int को कनवर्ट करें किसी एक कड़ी में WHERE 1 = 1 और <conditions> का उपयोग क्यों करेगा? आप एक ऐसी फ़ाइल कैसे पढ़ते हैं जो उपयोग में है? जावास्क्रिप्ट पुस्तकालयों में प्रमुख अर्धविराम क्या करता है? Href बनाम onclick में जावास्क्रिप्ट फ़ंक्शन पायथन में एक सूची के रूप में शब्दकोश कुंजी को वापस कैसे करें?

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

मुझे एक प्रश्न है जैसे:

MyModel.where(id: ids) 

जो SQL क्वेरी की तरह उत्पन्न करता है:

 SELECT "my_models".* FROM "my_models" WHERE "my_models"."id" IN (1, 28, 7, 8, 12) 

अब मैं इसे बदलने के बजाय IN बजाय ANY का उपयोग करना चाहता हूं। मैंने इसे बनाया है:

 MyModel.where("id = ANY(VALUES(#{ids.join '),('}))" 

अब जब मैं खाली ids = [] उपयोग करता हूं ids = [] मुझे फेलिंग त्रुटि मिलती है:

 MyModel Load (53.0ms) SELECT "my_models".* FROM "my_models" WHERE (id = ANY(VALUES())) ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")" ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")" Position: 75: SELECT "social_messages".* FROM "social_messages" WHERE (id = ANY(VALUES())) from arjdbc/jdbc/RubyJdbcConnection.java:838:in `execute_query' 

वेब के समाधान से एकत्रित समाधान "रेल के साथ एक WHERE खंड में IN की बजाय किसी को कैसे उपयोग करें?"

IN भावों के दो रूप हैं:

  • expression IN (subquery)
  • expression IN (value [, ...])

इसी तरह, ANY निर्माण के साथ दो रूपों:

  • expression operator ANY (subquery)
  • expression operator ANY (array expression)

किसी भी तकनीक के लिए एक सबक्वायरी काम करता है, लेकिन प्रत्येक के दूसरे रूप में, IN को मानों की एक सूची (जैसा कि मानक एसक्यूएल में परिभाषित किया गया है) की उम्मीद है, जबकि = ANY एक सरणी की अपेक्षा करता है।

किस का उपयोग करना है?

ANY बाद में, अधिक बहुमुखी जोड़ है, यह किसी बूलियन मूल्य को वापस आने वाले किसी भी बाइनरी ऑपरेटर के साथ जोड़ा जा सकता है। किसी विशेष मामले में ANY से जला वास्तव में, इसका दूसरा रूप आंतरिक रूप से लिखा गया है:

IN = ANY साथ फिर से लिखा जाता है
<> ALL साथ NOT IN लिखा गया है

किसी भी प्रश्न के लिए अपने आप को देखने के लिए EXPLAIN आउटपुट की जांच करें। यह दो चीजें साबित करता है:

  • IN = ANY जितना तेज़ कभी भी नहीं हो सकता
  • = ANY काफी तेजी से नहीं होने वाला है।

विकल्प का निर्धारण करना चाहिए कि क्या प्रदान करना आसान है : मूल्यों की सूची या एक सरणी (संभवतया ऐरे शाब्दिक रूप से – एक एकल मान)।

अगर आपके द्वारा पास किए जाने वाले आईडी डीबी के भीतर से आते हैं, तो उन्हें सीधे (सबक्वरी) चुनने के लिए या एक स्रोत के साथ क्वेरी में एक JOIN (जैसे कि @ एमयू टिप्पणी की गई ) को एकीकृत करने में अधिक कुशल है।

अपने क्लाइंट से मूल्यों की एक लंबी सूची को पारित करने के लिए और सबसे अच्छे प्रदर्शन प्राप्त करने के लिए, सरणी का उपयोग करें, unnest() और जुड़ें, या इसे VALUES का उपयोग करके तालिका अभिव्यक्ति के रूप में प्रदान करें (जैसे कि @पीनीएम ने टिप्पणी की है )। अधिक:

  • बड़ी पोस्ट में एक पोस्टग्रेज़ क्वेरी को ऑप्टिमाइज़ करना

नल मूल्यों की उपस्थिति में, NOT IN कि अक्सर गलत विकल्प होता है और NOT EXISTS (और तेज, भी) सही होगा:

  • उन पंक्तियों का चयन करें जो अन्य तालिका में मौजूद नहीं हैं

= ANY लिए सिंटेक्स

सरग्रे अभिव्यक्ति पोस्टग्रेर्स के लिए स्वीकार करता है:

  • एक सरणी कंस्ट्रक्टर (सरणी को पोस्टग्रेस पक्ष पर मानों की सूची से बनाया गया है): ARRAY[1,2,3]
  • या '{1,2,3}' फार्म का एक सरणी शब्दशः

अमान्य प्रकार डालने से बचने के लिए, आप स्पष्ट रूप से डाली जा सकते हैं:

 ARRAY[1,2,3]::numeric[] '{1,2,3}'::bigint[] 

सम्बंधित:

  • PostgreSQL: प्रक्रिया के लिए सरणी गुजरने का मुद्दा
  • Postgres फ़ंक्शन के लिए कस्टम प्रकार सरणी कैसे पारित करें

या आप एक VARIADIC पैरामीटर लेते हुए एक पोस्टग्रेज़ फ़ंक्शन बना सकते हैं, जो व्यक्तिगत तर्क लेता है और उनसे सरणी बनाता है:

  • एकल पैरामीटर में एकाधिक मान पास करना

कैसे रूबी से सरणी को पारित करने के लिए?

id को integer :

 MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i}) 

लेकिन मैं सिर्फ रूबी में डब रहा हूं। @ एमयू इस संबंधित उत्तर में विस्तृत निर्देश प्रदान करता है:

  • रूबी में एक एसक्यूएल क्वेरी में मानों की सरणी भेजना?