পোস্টগ্রিস অ্যারেতে মান বিদ্যমান কিনা তা পরীক্ষা করুন


196

Postgres 9.0 ব্যবহার করে, পরীক্ষা দেওয়ার জন্য আমার একটি উপায় প্রয়োজন যদি প্রদত্ত অ্যারেতে কোনও মান বিদ্যমান থাকে। এখনও অবধি আমি এ জাতীয় কিছু নিয়ে এসেছি:

select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)

তবে আমি ভাবতে থাকি যে এটির আরও সহজ উপায় হওয়া উচিত, আমি এটি দেখতে পাচ্ছি না। এটি আরও ভাল বলে মনে হচ্ছে:

select '{1,2,3}'::int[] @> ARRAY[value_variable::int]

আমি বিশ্বাস করি এটি যথেষ্ট হবে। তবে আপনার যদি এটি করার অন্যান্য উপায় থাকে তবে দয়া করে ভাগ করুন!

উত্তর:


323

ANYনির্মাণের সাথে সহজ :

SELECT value_variable = ANY ('{1,2,3}'::int[])

ANY(প্রথম বন্ধনীগুলির মধ্যে) এর ডান সংক্ষেপণ হয় একটি সেট (উদাহরণস্বরূপ, একটি subquery ফলাফল) বা একটি অ্যারে হতে পারে । এটি ব্যবহারের বিভিন্ন উপায় রয়েছে:

গুরুত্বপূর্ণ পার্থক্য: (অ্যারে অপারেটার <@, @>, &&। এট) আশা অ্যারের operands এবং ধরনের সমর্থন জিন বা সারকথা সূচকের , পোস্টগ্রি মান বিতরণে যখন ANYকনস্ট্রাক্ট একটি আশা উপাদান প্রকার বাম প্রতীক এবং এইসব সূচকের সমর্থন করে না। উদাহরণ:

এর কোনওটিই NULLউপাদানগুলির পক্ষে কাজ করে না। এর জন্য পরীক্ষা করা NULL:


ধন্যবাদ। ম্যানুয়ালটির সেই অংশটি অবশ্যই এড়িয়ে গেছে। এটি দুর্দান্ত কাজ করে। এটি স্বয়ংক্রিয় castালাইয়ের একটি পার্শ্ব প্রতিক্রিয়া রয়েছে। উদাহরণস্বরূপ: নির্বাচন 1 :: ছোট্ট = কোনও ('{1,2,3}' :: int []) কাজ করে। কেবল প্রকাশের ডানদিকে যে কোনও () রাখার বিষয়টি নিশ্চিত করুন।
মাইক স্টারভ

উত্তর করার জন্য ধন্যবাদ. আমার ক্যোয়ারী স্থানীয়ভাবে কাজ করেছে এমন একটি সমস্যা পেয়েছেন, তবে হিরকু এই বার্তাটি ছুঁড়ে ফেলছিলেন ANY/ALL (array) requires array on right side, অ্যাড যোগ করুন মোহন ::int[]
দয়ালু

যেখানে S.employee_id <@ ANY ('"+ কর্মীআইডিআর্রে +"' :: ইতিমধ্যে]] এটি পিএসকিউএলএক্সপেশন: ত্রুটি: অনুপস্থিত মাত্রা মান
রামপ্রসাদ

3
যদিও এটি ইন্টারনেট বছরগুলিতে ডাইনোসর প্রশ্ন, তবে আমার মতো ধীর লোকদের সচেতন করা উচিত যা 'something' = ANY(some_array)একটি WHEREধারাতেও ব্যবহার করা যেতে পারে । কেবল ক্রমের কাছে জানা কারণগুলির জন্য, আমি গত চার বছর ধরে এই ভেবে ব্যয় করেছি যে আমি WHEREধারাগুলিতে অ্যারে তুলকগুলি ব্যবহার করতে পারি না । সেই দিনগুলি এখন কেটে গেছে। (ছোটবেলায় আমাকে মাথায় ফেলে দেওয়া হয়েছিল, তাই সম্ভবত এটি কেবল আমার)।
জিটি

1
@ জিটি: এটির সংক্ষিপ্তসার: কোনও boolean অভিব্যক্তি ক্লোজে কাজ করে WHERE- ক্রম ইচ্ছুক।
এরউইন ব্র্যান্ডসেটেটার

90

যে ট্র্যাপটি আমি পেয়েছিলাম তার জন্য নজর রাখুন: নির্দিষ্ট মানটি কোনও অ্যারেতে উপস্থিত নেই কিনা তা পরীক্ষা করে নিলে আপনার করা উচিত নয়:

SELECT value_variable != ANY('{1,2,3}'::int[])

কিন্তু ব্যবহার

SELECT value_variable != ALL('{1,2,3}'::int[])

পরিবর্তে.


2
একটি ডাবল নেতিবাচক ধরনের; ALLবনামANY
ভোলআরন

43
SELECT NOT value_variable = ANY('{1,2,3}'::int[])আরও পঠনযোগ্য হতে পারে
ওন্দেজ বৌদা

28

তবে এটি করার অন্যান্য উপায় থাকলে দয়া করে শেয়ার করুন share

আপনি দুটি অ্যারে তুলনা করতে পারেন। বাম অ্যারের মানগুলির মধ্যে যদি কোনও ডান অ্যারেতে মানগুলি ওভারল্যাপ করে তবে তা সত্য হয়। এটি এক ধরণের হ্যাকিশ, তবে এটি কার্যকর works

SELECT '{1}'   && '{1,2,3}'::int[];  -- true
SELECT '{1,4}' && '{1,2,3}'::int[];  -- true
SELECT '{4}'   && '{1,2,3}'::int[];  -- false
  • প্রথম এবং দ্বিতীয় ক্যোয়ারিতে মানটি 1সঠিক অ্যারেতে থাকে
  • লক্ষ্য করুন যে দ্বিতীয় কোয়েরিটি হ'ল true, যদিও মানটি 4সঠিক অ্যারেতে অন্তর্ভুক্ত নেই
  • তৃতীয় ক্যোয়ারির জন্য, বাম অ্যারেতে কোনও মান (যেমন, 4) ডান অ্যারেতে নেই, সুতরাং এটি ফিরে আসেfalse

অ্যারেতে একটি মান রাখতে আমি কীভাবে অন্য টেবিল থেকে একটি কলাম অনুসন্ধান করতে পারি? উদাহরণস্বরূপ, বিয়ারগুলি থেকে * নির্বাচন করুন যেখানে স্টাইল_আইড (ব্যবহারকারীদের থেকে পছন্দগুলি নির্বাচন করুন যেখানে আইডি = 1) সীমা 1; স্টাইল_আইডি একটি পূর্ণসংখ্যা ডেটা টাইপ; পছন্দগুলি পূর্ণসংখ্যা হয় [] আমি এই ত্রুটিটি পেয়েছি ত্রুটি: অপারেটরটির অস্তিত্ব নেই: পূর্ণসংখ্যা = পূর্ণসংখ্যা [] লাইন 1: বিয়ার থেকে * নির্বাচন করুন যেখানে স্টাইল_আইড নির্বাচন করুন (পছন্দসমূহ নির্বাচন করুন চ ... IN ইঙ্গিত: কোনও অপারেটর প্রদত্ত নাম এবং যুক্তির ধরণের সাথে মেলে না (গুলি) আপনার স্পষ্ট টাইপ কাস্ট যোগ করার জন্য প্রয়োজন হতে
এইচপি

@ এইচপি এই প্রশ্নটি সমাধান করার বিভিন্ন উপায় রয়েছে, আপনার নতুন প্রশ্ন জিজ্ঞাসা করা উচিত
ভলআরোন

আপনি কি নিশ্চিত যে কোনও বিদ্যমান প্রশ্ন নেই? @ ভোলআরন
এইচপি

@ এইচপি মোটেও নয়, তবে মন্তব্যগুলি কোনও প্রশ্ন বা উত্তর সম্পর্কিত মন্তব্যের জন্য; সাধারণত আরও তথ্য যুক্ত করতে বা যে তথ্যটির দিকে নজর দেওয়া হয়নি সেগুলি চাওয়ার জন্য। আপনি একটি প্রশ্ন জিজ্ঞাসা করছেন যা এই উত্তরের সাথে সম্পর্কিত নয়। আমি মনে করি আপনার মন্তব্যটি নতুন পোস্ট হিসাবে জিজ্ঞাসা করে আপনার আরও ভাগ্য হবে;)
ভলিউরন

@ এইচপি আপনি যদি নিজের প্রশ্ন পোস্ট না করেন তবে আপনি এখানে দেখতে পাবেন: sqlfiddle.com/#!15/144cd/3 আপনার কী করা দরকার তার উদাহরণের জন্য - আপনার সমস্যাটি আলাদা কারণ আপনাকে আপনার অ্যারে আনস্ট করা দরকার।
ভোলআরন

4

unnestপাশাপাশি ব্যবহার করা যেতে পারে। এটা তোলে সারির একটি সেটে অ্যারের বিস্তৃতি এবং তারপর কেবল একটি মান পরীক্ষণ থাকবেই বা না ব্যবহার হিসাবে সহজ হিসাবে INবা NOT IN

যেমন

  1. আইডি => উউইড

  2. ব্যতিক্রম_ তালিকা_আইডি => ইউইড []

select * from table where id NOT IN (select unnest(exception_list_ids) from table2)


হ্যাঁ. নোট করুন যে আমার ক্যোয়ারী পরিকল্পনাগুলিতে নির্বাচন করুন নিখরচায় = কোনও হিসাবে ভাল নয়। আপনি যা চান / প্রত্যাশা করেন তা আপনি পেয়েছেন কিনা তা দেখার জন্য আমি ক্যোরির পরিকল্পনাগুলি পরীক্ষা করার পরামর্শ দেব।
রব বাইগ্রাভ

3

অ্যারেতে কোনও উপাদানটির অস্তিত্ব সন্ধান করার সময় পোস্টগ্রিসের এসকিউএল পার্সার পাস করার জন্য যথাযথ castালাই প্রয়োজন। অ্যারে ব্যবহার করে অ্যারে ব্যবহারের একটি উদাহরণ ক্যোয়ারিতে জোয়ান ক্লজে অপারেটর রয়েছে:

সরলতার জন্য আমি কেবল প্রাসঙ্গিক অংশটি তালিকাবদ্ধ করি:

table1 other_name text[]; -- is an array of text

দেখানো এসকিউএল এর যোগদানের অংশ

from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text]

নিম্নলিখিতগুলিও কাজ করে

on t2.panel = ANY(t1.other_name)

আমি কেবল অনুমান করছি যে অতিরিক্ত কাস্টিংয়ের প্রয়োজনীয়তা রয়েছে কারণ কলামটির সঠিক ধরণের চিত্র নির্ধারণের জন্য পার্সকে টেবিল সংজ্ঞাটি আনতে হবে না। অন্যরা এই বিষয়ে মন্তব্য করুন।


1

হাই, সে আমার জন্য ভাল কাজ করে, কারও পক্ষে উপকারী হতে পারে

আপনার_সামগ্রী থেকে * নির্বাচন করুন যেখানে অ্যারে_ক্যালোম :: পাঠ্য ইলিকে যে কোনওভাবে (এআরএই ['% পাঠ্য_আর_আরক%' :: পাঠ্য]);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.