পোস্টে অ্যারে নেই


100

আমি পোস্টগ্রিসের নেটিভ অ্যারে টাইপটি ব্যবহার করছি এবং যেখানে অ্যারে প্রাপক আইডি নেই সেখানে রেকর্ডগুলি সন্ধান করার চেষ্টা করছি।

তারা কোথায় আছে তা আমি খুঁজে পেতে পারি:

SELECT COUNT(*) FROM messages WHERE (3 = ANY (recipient_ids))

তবে এটি কার্যকর হয় না:

SELECT COUNT(*) FROM messages WHERE (3 != ANY (recipient_ids))
SELECT COUNT(*) FROM messages WHERE (3  = NOT ANY (recipient_ids))

এই শর্তটি পরীক্ষা করার সঠিক উপায় কী?


না WHERE 3 NOT IN recipient_idsকাজ করে?
জানুস ট্রয়লসেন

4
সম্পর্কিত নোট: হিসাবে text[]এবং int[]অ্যারে:select not(array[1,2,3] @> array[3]);
স্টিভ পিক

4
প্রো টিপ: আপনি যদি পরীক্ষা করছেন যে কোনও nullকলাম কোনও অ্যারেতে রয়েছে কি না, এটি সর্বদা না বলবে। এটিকে 20 মিনিটের মতো ডিবিগ করার মতো বেশ কয়েকটি পদ্ধতি নিয়ে এসেছিল যাতে আপনি এই সিদ্ধান্তে আসতে পারেন যে নাল একটি অ্যারেতে রয়েছে কিনা তা আপনি পরীক্ষা করতে পারবেন না
Pena

উত্তর:


139
SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids))

আপনি সর্বদা অস্বীকার করতে পারেন WHERE (condition)সঙ্গেWHERE NOT (condition)


4
- @aschyiel তোমার কাছে ফিরে স্যুইচ করতে চাইতে পারেন ANYপরিবর্তে INহিসাবে আপনার recipient_ids: ইনপুট তালিকা বৃদ্ধি stackoverflow.com/questions/1009706/...
derekm

41

আপনি এটিকে কিছুটা ঘুরিয়ে বলতে পারেন এবং "3 টি সমস্ত আইডির সমান নয়":

where 3 != all (recipient_ids)

থেকে জরিমানা ম্যানুয়াল :

9.21.4। সমস্ত (অ্যারে)

expression operator ALL (array expression)

ডান হাতটি একটি বন্ধনীযুক্ত এক্সপ্রেশন, যা অবশ্যই একটি অ্যারের মান অর্জন করবে। বাম-হাতের এক্সপ্রেশনটি মূল্যায়ন করা হয় এবং প্রদত্ত অপারেটর ব্যবহার করে অ্যারের প্রতিটি উপাদানের সাথে তুলনা করা হয় , যা অবশ্যই বুলিয়ান ফলাফল অর্জন করতে পারে। ALLসমস্ত তুলনা যদি সত্য হয় (যদি অ্যারেতে শূন্য উপাদান থাকে সেই ক্ষেত্রেও) ফলাফলটি "সত্য"। কোনও মিথ্যা ফল পাওয়া গেলে ফলাফলটি "মিথ্যা"।


এটি anyএই ক্ষেত্রে কেন কাজ করে না তা সত্যই ব্যাখ্যা করে না
সানলিনসলে 5'19

কারণটি সঠিকভাবে ব্যাখ্যা করার কারণে এটি গ্রহণ করা উচিত। পিএস আপনি পোস্টগ্র্রেস ডকটিও খুঁজে পেতে anyএবং খুঁজে পেতে পারেন allযা বলে: " x <> ANY (a,b,c) সমান x <> a OR <> b OR x <> c"। রেফ: পোস্টগ্রেসক্লিটরিয়াল. com
টাইলার টেম্প

19

ALL/ANYউত্তরগুলি বাড়াচ্ছে

অতিরিক্ত নোটগুলি (যেমন: নুল গুলি সম্পর্কে ) প্রশংসা করে আমি ফলাফলগুলি ব্যবহার করতে allবা anyফলাফলটি অর্জন করতে সমস্ত সমাধান পছন্দ করি । অন্য উত্সাহ হিসাবে, এই অপারেটরদের সম্পর্কে চিন্তা করার একটি উপায় এখানে।

আপনি তাদের সম্পর্কে শর্ট-সার্কিট অপারেটর হিসাবে ভাবতে পারেন :

  • all(array)সরবরাহকারীর অপারেটরটি ব্যবহার করে রেফারেন্স মানটির সাথে প্রতিটি তুলনা করে অ্যারের সমস্ত মান দিয়ে যায়। তুলনা ফলানোর falseসাথে সাথে প্রক্রিয়াটি মিথ্যা দিয়ে শেষ হয়, অন্যথায় সত্য। (শর্ট সার্কিট যৌক্তিকের সাথে তুলনাযোগ্য and))
  • any(array)সরবরাহকারীর অপারেটরটি ব্যবহার করে রেফারেন্স মানটির সাথে প্রতিটি তুলনা করে অ্যারের সমস্ত মান দিয়ে যায়। তুলনা ফলানোর trueসাথে সাথে প্রক্রিয়াটি সত্যের সাথে শেষ হয়, অন্যথায় মিথ্যা। (শর্ট সার্কিট যৌক্তিকের সাথে তুলনাযোগ্য or))

এ কারণেই 3 <> any('{1,2,3}')কাঙ্ক্ষিত ফলাফল পাওয়া যায় না: প্রক্রিয়াটি অসমতার জন্য 3 এর সাথে 1 এর সাথে তুলনা করে, যা সত্য এবং তাত্ক্ষণিক সত্য ফিরে আসে। 3 টির চেয়ে আলাদা অ্যারেতে একটি একক মান পুরো শর্তটি সত্য করে তোলার জন্য যথেষ্ট। শেষ অ্যারে অবস্থানের 3টি প্রোব is ব্যবহার না.

3 <> all('{1,2,3}')অন্যদিকে সমস্ত মান সমান নয় তা নিশ্চিত করে 3. এটি সামগ্রীর ফলাফল হিসাবে মিথ্যা ফিরিয়ে আনার জন্য মিথ্যা (এই ক্ষেত্রে সর্বশেষ) প্রদান করে এমন একটি উপাদান পর্যন্ত সত্য ফলনকারী সমস্ত তুলনার মধ্য দিয়ে চলবে। ওপি এটিই চায়।



12

একটি আপডেট:

9.3 পোস্টগ্রেস হিসাবে

NOTএটি অর্জন করতে আপনি @> (অপারেটর সমন্বিত) সাথে মিল রেখে ব্যবহার করতে পারেন ।

আইই।

SELECT COUNT(*) FROM "messages" WHERE NOT recipient_ids @> ARRAY[3];


12

NULLs থেকে সাবধান থাকুন

উভয় ALL:

(some_value != ALL(some_array))

এবং ANY:

NOT (some_value = ANY(some_array))

some_arrayনাল না যতক্ষণ কাজ করবে । যদি অ্যারেটি শূন্য হতে পারে তবে অবশ্যই অবশ্যই এটির জন্য কোয়েলেস () দিয়ে অ্যাকাউন্ট করতে হবে

(some_value != ALL(coalesce(some_array, array[]::int[])))

বা

NOT (some_value = ANY(coalesce(some_array, array[]::int[])))

ডক্স থেকে :

অ্যারের এক্সপ্রেশনটি যদি নাল অ্যারে দেয় তবে যে কোনওের ফলাফল শূন্য হবে

অ্যারের এক্সপ্রেশনটি যদি একটি নাল অ্যারে দেয় তবে সমস্তের ফলাফল নাল হবে


3

নোট করুন যে কোনও / ALL অপারেটর অ্যারে সূচকগুলি নিয়ে কাজ করবে না। সূচকগুলি যদি মনে থাকে:

SELECT COUNT(*) FROM "messages" WHERE 3 && recipient_ids

এবং নেতিবাচক:

SELECT COUNT(*) FROM "messages" WHERE NOT (3 && recipient_ids)

এরপরে একটি সূচক তৈরি করা যেতে পারে:

CREATE INDEX recipient_ids_idx on tableName USING GIN(recipient_ids)

অন্যান্য উত্তরের মতো নয়, এই উত্তরটি পোস্টগ্র্রেএসকিউএল অ্যারে ওভারল্যাপ অপারেটরটি ব্যবহার করে। &&
সিলিং গেকো

6
এটি লিখিত হিসাবে কাজ করবে না। && এবং @> এর মতো অ্যারে অপারেটরগুলির উভয় উপাদানকে অ্যারে হওয়া প্রয়োজন, যা 3 টি নয়। এটির জন্য কাজ করতে জন্য, ক্যোয়ারী হিসেবে লেখা যেতে প্রয়োজন হবে: SELECT COUNT(*) FROM "messages" WHERE ARRAY[3] && recipient_ids
ডোলোগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.