কোন subquery ঠিক একটি স্বতন্ত্র ফলাফল এবং সংক্ষিপ্তভাবে একটি নির্দিষ্ট মান আছে কিনা তা পরীক্ষা করে দেখুন?


10

আমি নিজেকে নিম্নলিখিত লিখতে পেয়েছি:

select 'yes' 
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);

এবং ভাবছেন যে খুব বেশি পাঠযোগ্যতার ত্যাগ ছাড়াই আরও সংক্ষিপ্ত উপায় আছে কিনা।

আমি একটি উপায় পেয়েছি যা আমি উত্তর হিসাবে পোস্ট করছি তবে আমি এটির সাথে পুরোপুরি খুশি নই এবং বিকল্পগুলিতে খুব আগ্রহী হব

এই ক্ষেত্রে valঅনন্য foo- কোন সদৃশ আছে


আমি কি সঠিকভাবে বুঝতে পারি যে আপনি সাবকিউরিটির ফলাফলের জন্য ঠিক এক সারি চান ?
এরউইন ব্র্যান্ডস্টেটার


আপনি শিরোনামে যার উল্লেখ করেছেন। "স্বতন্ত্র" এর পরে বা তার আগে এর ফলাফল হওয়া উচিত কিনা তা আমি নিশ্চিত ছিলাম না।
এরউইন ব্র্যান্ডস্টেটার

অই হ্যাঁ, যে এক :) আমি বরং confusingly আমার মধ্যে উপ-ক্যোয়ারী উল্লেখ ছিল উত্তর - পুলিশের অনেক বেশী নির্দিষ্ট এবং নমনীয়, যেমন আপনার কাছে ব্যবহার করতে পারেন count(distinct val), যদিও আমার বাস্তব বিশ্বের ক্ষেত্রে এটি কোনো পার্থক্য করে তোলে
জ্যাক ব্যবহার করে দেখুন বলেছেন topanswers.xyz

উত্তর:


8

সংক্ষিপ্ত, দ্রুত (বিশেষত অনেকগুলি সারি সহ), আমার পঠনযোগ্যতা সম্পর্কিত প্রিয় এবং ডুপসের সাথেও কাজ করবে:

SELECT count(*) = 1 AND min(val) = 1 FROM foo;

রিটার্ন TRUE/ FALSE.. অথবা NULL- শুধুমাত্র এক সারি এর ক্ষেত্রে val IS NULL, কারণ count()কখনই ফিরে আসে না NULLবা কোনও সারি হয় না।

1উদাহরণের মধ্যে দ্বিতীয়টি প্রথমটির মতোই ঘটবে, কারণ আপনার উদাহরণ।


প্রশ্নের ক্যোয়ারী NULLমানগুলির সাথে ব্যর্থ হয় । সাধারণ ডেমো বিবেচনা করুন:

CREATE TABLE foo (id int, val int);
INSERT INTO foo VALUES (1, 1),(2, NULL);

SELECT 'yes' 
WHERE      EXISTS(SELECT * FROM foo WHERE val =  1)
AND    NOT EXISTS(SELECT * FROM foo WHERE val <> 1);

IS DISTINCT FROMএটি ঠিক করে দেবে, তবে এটি অনুলিপিতে এখনও ব্যর্থ হতে পারে val- যা আপনি এই মামলার পক্ষে অস্বীকার করেছেন।


আপনার উত্তর ভাল কাজ করে।
ফিরে আসে 'yes'/ সারি নেই।

যদিও আমি এই সংক্ষিপ্ত রূপটি পছন্দ করব। ভুলে যাবেন না যে পোস্টগ্রিসএসকিউএল (ওরাকলের বিপরীতে) একটি সঠিক booleanধরণ রয়েছে

SELECT array_agg(val) = array[1] FROM foo;

রিটার্ন TRUE/ FALSE/ NULL


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

5

@ এরউইনের উত্তরের একটি পার্থক্য। না COUNT()মোটেও, শুধুমাত্র MIN()এবং MAX()। এটি বড় টেবিলের সাথে কিছুটা দক্ষ এবং আপনার ক্ষেত্রে নয়) নকল val:

SELECT MIN(val) = 1 AND MAX(val) = 1 FROM foo;

+1 ধন্যবাদ এটি অবশ্যই
নালগুলি

@ জ্যাক: হ্যাঁ আপনার টেবিলের নাল আছে? অথবা আপনি উভয় ক্ষেত্রেই (সাথে এবং বাইরে) উত্তর চান?
ypercubeᵀᴹ

কোন খনি নয় - আমিও ব্যবহার করতে পারি :)
জ্যাক বলেছেন শীর্ষস্থানীয়দের চেষ্টা করুন। xzz

হতে চান অনেক যখন কোয়েরি ফলাফল পরীক্ষা মত - একটি ম্যাচিং সূচকের সাথে বড় টেবিল, কিন্তু সঞ্চালিত উপর দ্রুত যেমন একটি সূচক অনুপস্থিতিতে অভিন্নরুপে।
এরউইন ব্র্যান্ডস্টেটার


1

এইটি ফিরে আসে true, falseবা একটি খালি ফলাফল:

 select j.val is null 
 from foo left join foo as j on j.val <> foo.val 
 where foo.val = 1 limit 1;

এক নজরে, এই আসতে বলে মনে হচ্ছে না falseযদি সেখানে মান fooযেখানে val<>1?
জ্যাক বলছেন topanswers.xyz

@ জ্যাকডুগলাস ওহ, দুঃখিত আমি প্রথম প্রথম কাজটি ভুল বুঝতে পেরেছি। সংশোধন করা হয়েছে।
গ্রেহেম্প

কাজ - NULLমান হিসাবে ব্যতীত যা এক্ষেত্রে বাতিল হয়নি।
এরউইন ব্র্যান্ডস্টেটার

আমার মনে NULLহয় @ ইরুইন ব্র্যান্ডসটেটার ব্যবহার করে কাজ করা যেতে পারে IS [NOT] DISTINCT FROM
গ্রেহেম্প

1
@ গ্রেহেম্প: এই ক্ষেত্রে নয়। শুরুতে LEFT JOIN foo j ON j.val <> foo.valএকটি সারি সনাক্ত করতে ব্যর্থ j.val IS NULL। আপনি যদি এটির সাথে অন্তর্ভুক্ত ON j.val IS DISTINCT FROM foo.valকরতে চান তবে দুটি ক্ষেত্রে পৃথক পৃথক বলার জন্য jসংজ্ঞায়িতের অন্য কলামে পরীক্ষা NOT NULLকরতে হবে। তবে কোনও অতিরিক্ত কলাম সংজ্ঞায়িত করা হয়নি।
এরউইন ব্র্যান্ডস্টেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.