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


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.