(A = 1 এবং খ = 1) বনাম (ক << 1 এবং খ <> 1) নয়


16

ইন WHEREএকটি SQL কোয়েরি ধারা আমি একই আচরণ আছে এই দুটি শর্ত আশা:

NOT (a=1 AND b=1)

বনাম

a<>1 AND b<>1

প্রথম শর্তটি প্রত্যাশার মতো আচরণ করে, এবং যখন আমি দ্বিতীয় শর্তটি একই জিনিসটি করতে করতে পারি তখনও তা হয় না।

এটি খুব বেসিক স্টাফ, তবে লজ্জাজনকভাবে আমি দেখতে পাচ্ছি না আমি কী ভুল করছি।


আপনি উদাহরণ ডেটা এবং প্রত্যাশিত ফলাফল বনাম প্রকৃত ফলাফল পোস্ট করতে পারেন?
গ্যারেথ লিওনস

6
তার উত্তরে Lenard দ্বারা হিসাবে উল্লিখিত, এই ডি মরগান নিয়ম একটি উদাহরণ রয়েছে: (A এবং B) না = (না একটি) বা (না বি) , না (A অথবা B) = (একটি) এবং (না বি) । নাল মান সহ সাবধানতা অবলম্বন করুন।
ব্যারানকা

2
শুধু ইংরেজিতে এটি ভাবুন। আপনার প্রথমটি হ'ল "এটি এমন নয় যে আমি ফ্রান্সের রাজা এবং মানবও উভয়ই" - সুনাম সত্য। আপনার দ্বিতীয়টি হ'ল "আমি না ফ্রান্সের রাজা বা মানব না" - প্রখ্যাত মিথ্যা।
প্যাট্রিক স্টিভেন্স

3
"ডি মরগানের আইন" এর সাথে এই দ্বন্দ্ব। সমান হবে a <> 1 OR b<>1
উইলেম ভ্যান অনসেম

উত্তর:


46

তারা সমতুল্য নয়।

NOT (a=1 AND b=1)

এর সাথে সমান:

(NOT a=1 OR NOT b=1) <=> (a<>1 OR b<>1)

এই সমতুল্য হিসাবে পরিচিত হয় De Morgan's Law। উদাহরণস্বরূপ দেখুন:

https://en.wikipedia.org/wiki/De_Morgan%27s_laws

বুলিয়ান বীজগণিতের এক্সপ্রেশনগুলির জন্য সমানতাকে প্রমাণ / প্রমাণ করার জন্য একটি দুর্দান্ত কৌশল হ'ল ডোমেনগুলির জন্য একটি সিটি ব্যবহার করা এবং পাশাপাশি প্রকাশের সাথে তুলনা করা:

with T(a) as ( values 0,1 )
   , U(a,b) as (select t1.a, t2.a as b 
               from t as t1 
               cross join t as t2
) 
select a,b
    , case when not (a=1 and b=1) then 1 else 0 end
    , case when a<>1 and b<>1 then 1 else 0 end 
from U

A           B           3           4          
----------- ----------- ----------- -----------
          0           0           1           1
          0           1           1           0
          1           0           1           0
          1           1           0           0

সম্পাদনা করুন: যেহেতু ডিবি 2 বুলিয়ান ডেটাটাইপ সমর্থন করে না আমি উদাহরণটি এখানে প্রসারিত করেছি:

http://sqlfiddle.com/#!15/25e1a/19

পুনর্লিখিত ক্যোয়ারী দেখে মনে হচ্ছে:

with T(a) as ( values (0),(1),(null) )
   , U(a,b) as (select t1.a, t2.a as b 
                from t as t1 
                cross join t as t2
) 
select a,b
     , not (a=1 and b=1) as exp1 
     , a<>1 or b<>1 as exp2
from U;

ক্যোয়ারির ফলাফল:

a       b       exp1        exp2
--------------------------------
0       0       true        true
0       1       true        true
0       (null)  true        true
1       0       true        true
1       1       false       false
1       (null)  (null)      (null)
(null)  0       true        true
(null)  1       (null)      (null)
(null)  (null)  (null)      (null)

যেমন Exp1 এবং exp2 সমান হয়।


16
+1 কেবলমাত্র দে মরগানের উল্লেখ করার জন্য। যে কোনও প্রোগ্রামিং / স্ক্রিপ্টিং যে কোনও ফর্ম করছে তার জন্য পড়া দরকার।
টনি

তবে নুল কী হবে?
dan04

@ dan04 আপনি প্রথম লাইনে NULL যুক্ত করতে পারেন (ক্যোরিটি with T(a) as ( values 0,1,NULL )আবার তৈরি করুন এবং পুনরায় চালনা করুন এবং আপনি কী ঘটবেন তা দেখতে পাবেন N NULL অবশ্যই আমাদের শিখেছে বেশিরভাগ সেট সমতুল্য নিয়মগুলিতে একটি রেঞ্চ ফেলে Short সংক্ষিপ্ত উত্তরটি হ'ল = NULL এবং একটি < > NUL উভয়ই NUL ফলন করে, তাই তারা অন্য ক্ষেত্রে পড়ে যাবে further আরও পড়ার জন্য: ( স্ট্যাকওভারফ্লো / প্রশ্ন / 1833949/… )
ব্রায়ান জে

আমি নিশ্চিত না যে আপনাকে ডিবি 2 এর জন্য প্রথম উদাহরণটি কেন সংশোধন করতে হয়েছিল। এটি আমার জন্য প্রদর্শিত হিসাবে কাজ করে। আমি DB2 LUW এর চেয়ে আমার জন্য DB2 ব্যবহার করছি। দ্বিতীয় উদাহরণটির জন্য ডিবি 2 এর জন্য কিছু বাক্য গঠন ত্রুটি রয়েছে।
jmarkmurphy

@ জার্কমুরফি, আমি আমার জন্য ডিবি 2 জানি না, সম্ভবত এটি সেখানে কাজ করে। LUW এর ক্ষেত্রে কেস এক্সপ্রেশন মানচিত্র 0 বা 1 হয় যা যাতে নালকেও অন্তর্ভুক্ত করতে পরিবর্তন করতে হবে। এটি করার মাধ্যমে কেস এক্সপ্রেশনটি এখন আর তুচ্ছ (আইএমও) হয় না এবং এক্সপ্রেশনগুলি নিয়ে তর্ক করা কঠিন হয়ে যায়।
লেনার্ট

9

আপনার প্রথম উদাহরণটি বলছে:

সব সারি ফিরুন ছাড়া যেখানে উভয় একটি = 1 এবং খ = 1

আপনার দ্বিতীয় উদাহরণটি বলছে:

সব সারি ফিরুন ছাড়া যেখানে পারেন একটি = 1 বা খ = 1

দ্বিতীয় প্রশ্নের সাথে প্রথম হিসাবে একই ফিরে যাওয়ার জন্য, আপনাকে আপনার পরিবর্তন করা উচিত ANDএকটি থেকেOR

CREATE TABLE #Test (a BIT, b BIT);

INSERT INTO #Test
        ( a, b )
VALUES
        ( 0, 0 ),
        ( 1, 0 ),
        ( 0, 1 ),
        ( 1, 1 );

SELECT * FROM #Test AS t
WHERE NOT (a=1 AND b=1);

SELECT * FROM #Test AS t
WHERE (a <> 1 OR b <> 1);

এটি নিম্নলিখিত ফলাফলগুলি প্রদান করে

a   b
0   0
1   0
0   1

আপনি কেন বর্ণনা করতে পারেন কেন a<>1 AND b<>1"হয় a = 1 বা b = 1" তে অনুবাদ?
two1ejack

1
@ doub1ejack, আপনি এটি প্রথম সমতুল্য করার জন্য আপনার দ্বিতীয় বিবৃতিতে একটি অতিরিক্ত অস্বীকৃতি প্রয়োজন: NOT ( a=1 OR b=1 )। দুর্ভাগ্যক্রমে প্রাকৃতিক ভাষাগুলিতে অস্পষ্টতা থাকে যা যৌক্তিক সূত্রগুলিকে প্রাকৃতিক ভাষায় অনুবাদ করতে এবং তদ্বিপরীতকে মুশকিল করে তোলে। উদাহরণস্বরূপ, neither a=1 nor b=1মানে NOT ( a=1 OR b=1 )বা না (NOT a=1) OR (NOT b=1)?
লেনার্ট

1
@ two1ejack "গাড়িটি লাল এবং তার চারটি দরজা রয়েছে" এর বিপরীতটি হল "হয় গাড়ি লাল নয়, অথবা এর চারটি দরজা নেই" " যদি বিবৃতিটি সত্য করে তুলতে একাধিক জিনিস সত্য হতে হয়, তবে কেবলমাত্র এটির মধ্যে একটির পক্ষে এটি মিথ্যা করতে মিথ্যা হতে হবে।
hobbs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.