दिलचस्प पोस्ट
ASP.NET AJAX में एक UpdatePanel को गतिशील रूप से नियंत्रण जोड़ना क्या जावास्क्रिप्ट स्विच वक्तव्य में सख्त तुलना करने के लिए सुरक्षित है? आप नेट पर विभिन्न असेंबली संस्करणों में उपयोगकर्ता। कॉन्फिग सेटिंग्स कैसे रख सकते हैं? WPF – कैसे टेम्पलेट के साथ छवि बटन बनाने के लिए JasperReports: कैसे jsp पृष्ठ में रिपोर्ट को कॉल करने के लिए स्ट्रिंग में रूबी की नियमित अभिव्यक्ति की सभी घटनाओं के लिए मैं मैच डेटा कैसे प्राप्त करूं? .NET के साथ एक सरणी को यादृच्छिक बनाने का सर्वोत्तम तरीका नमक उत्पन्न और खुले स्रोत सॉफ्टवेयर मैं मास्टर / मूल के साथ अलग सिर कैसे सम्मिलित कर सकता हूं? UITextField की अधिकतम वर्ण लंबाई निर्धारित करें छवियों के साथ Android HTML.fromHTML ()? पासवर्ड एक विशिष्ट URL की सुरक्षा करता है सी पॉइंटर्स: निश्चित आकार की एक सरणी की ओर इशारा करते हैं कस्टम फ़्रेम में Array.prototype जोड़ना जेएस ली टैग onclick IE8 पर काम नहीं कर रहा है

रेल के साथ एक 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' 

Solutions Collecting From Web of "रेल के साथ एक 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}) 

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

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