পোস্ট ভার্সন এসকিউএল-এ কোনও বনাম অপারেটর


118

মধ্যে পার্থক্য কি INএবং ANYপোস্টগ্রি মধ্যে অপারেটর?
উভয়ের কাজের ব্যবস্থা একই বলে মনে হচ্ছে। কেউ কি উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন?



এটা কি তোমার প্রশ্নের উত্তর?
বর্গক্ষেত্রে

উত্তর:


157

( INনা ANYহয় "অপারেটর" বা একটিও নয় A "কন্সট্রাক্ট" বা "সিনট্যাক্স উপাদান"))

যৌক্তিকভাবে , ম্যানুয়ালটি উদ্ধৃত করে :

INসমতূল্য = ANY

কিন্তু দুটি বাক্য গঠন রূপগুলো এর INএবং দুই রূপগুলো ANY। বিবরণ:

IN একটি গ্রহণ সেট সমতূল্য = ANYএকটি গ্রহণ সেট এখানে প্রদর্শিত:

তবে প্রত্যেকের দ্বিতীয় রূপটি অন্যটির সমতুল্য নয়। ANYকনস্ট্রাক্টের দ্বিতীয় ভেরিয়েন্টটি একটি অ্যারে নেয় (অবশ্যই একটি প্রকৃত অ্যারে প্রকারের হওয়া আবশ্যক), যখন দ্বিতীয় রূপটি INএকটি কমা-বিভাজিত মানগুলির তালিকা গ্রহণ করে । এটি মানগুলিতে পাস করার ক্ষেত্রে বিভিন্ন বিধিনিষেধের দিকে পরিচালিত করে এবং বিশেষ ক্ষেত্রে বিভিন্ন প্রশ্নের পরিকল্পনা তৈরি করতে পারে:

ANY আরও বহুমুখী

ANYযেমন বিভিন্ন অপারেটর, শুধু সঙ্গে মিলিত হতে পারে কনস্ট্রাক্ট, অনেক বেশী বহুমুখী =। উদাহরণ:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');

বিপুল সংখ্যক মানগুলির জন্য, প্রতিটিের জন্য একটি সেট স্কেল আরও ভাল সরবরাহ করা:

সম্পর্কিত:

বিপরীত / বিপরীত / বাদ

" idপ্রদত্ত অ্যারেতে সারিগুলি সন্ধান করুন":

SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);

ইনভার্সান: "সারি কোথায় idহয় না অ্যারের মধ্যে":

SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}');  -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));

তিনটি সমতুল্য। অ্যারে কনস্ট্রাক্টর সহ প্রথমটি , অন্য দুটি অ্যারে আক্ষরিক সহ । তথ্য প্রকারটি নির্বিঘ্নে প্রসঙ্গ থেকে নেওয়া যেতে পারে। অন্যথায়, যেমন একটি স্পষ্ট কাস্ট প্রয়োজন হতে পারে '{1,2}'::int[]

সহ সারিগুলি id IS NULLএই মত প্রকাশের কোনওটিই পাস করে না। NULLঅতিরিক্তভাবে মান অন্তর্ভুক্ত করতে :

SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;

4
এটি পরিষ্কারভাবে স্পষ্ট করে বলতে ভাল লাগবে যে দ্বিতীয় ধরণের ফলাফলগুলি সর্বদা একই রকম থাকবে। আমি 99% নিশ্চিত যে বাস্তবে এটি তবে উত্তরটি এটি বলে মনে হচ্ছে না। এর অর্থ হ'ল SELECT * from mytable where id in (1, 2, 3)সর্বদা একই সারিগুলির মতো হবে SELECT * from mytable where id = ANY('{1, 2, 3}'), এমনকি যদি তাদের সম্ভাব্যভাবে বিভিন্ন প্রশ্নের পরিকল্পনা থাকতে পারে।
কেপিডি

1
ANY !=অপারেটরের সাথে একত্রিত করা যায় না । আমি মনে করি না এটি নথিভুক্ত, তবে এর select * from foo where id != ANY (ARRAY[1, 2])মতো নয় select * from foo where id NOT IN (1, 2)। অন্যদিকে, select * from foo where NOT (id = ANY (ARRAY[1, 2]))প্রত্যাশার মতো কাজ করে।
qris

1
@ কিরিস: অপারেটরের ANYসাথে একত্রিত হতে পারে !=। তবে এটি আরও আছে। আমি উপরে একটি অধ্যায় যোগ করেছি। (নোট যে <>মান SQL এর যে অপারেটর হয় - যদিও !=। Postgres ভাল হিসাবে গ্রহণ করা হয়)
এরউইন Brandstetter

সর্বশেষ সংস্করণে NULLমানগুলি কীভাবে কাজ করে? চান WHERE id = ANY (ARRAY[1, 2]) OR id IS NULL;ঠিক যেমন ভাল কাজ করে?
ডিভিটন

1
@ ডিভিটান: (id = ...) IS NOT TRUEকাজ করে কারণ একটি আসল ম্যাচ আছে কিনা তা id = ...কেবল মূল্যায়ন করে TRUE। ফলাফল FALSEবা NULLআমাদের পরীক্ষা পাস। দেখুন: স্ট্যাকওভারফ্লো . com / a / 23767625 / 939860 । আপনার যুক্ত হওয়া এক্সপ্রেশনটি অন্য কোনও কিছুর জন্য পরীক্ষা করে। এটি সমতুল্য হবেWHERE id <> ALL (ARRAY[1, 2]) OR id IS NULL;
এরউইন ব্র্যান্ডসেটেটার

3

দুটি সুস্পষ্ট পয়েন্ট এবং পাশাপাশি অন্য উত্তরের বিষয়গুলিও রয়েছে:

  • সাব কোয়েরি ব্যবহার করার সময় এগুলি হুবহু সমমান:

    SELECT * FROM table
    WHERE column IN(subquery);
    
    SELECT * FROM table
    WHERE column = ANY(subquery);

অন্য দিকে:

  • কেবল INঅপারেটর একটি সাধারণ তালিকা মঞ্জুরি দেয়:

    SELECT * FROM table
    WHERE column IN(… ,  , …);

মনে হয় তারা হুবহু হ'ল ANYতালিকার সাথে কাজ করে না ভুলে গিয়ে বেশ কয়েকবার আমাকে ধরে ফেলেছে ।

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