नहीं (a = 1 और b = 1) बनाम (ए <> 1 और बी <> 1)


16

WHERESQL क्वेरी के खंड में मैं इन दोनों स्थितियों से समान व्यवहार की अपेक्षा करूंगा:

NOT (a=1 AND b=1)

बनाम

a<>1 AND b<>1

पहली स्थिति अपेक्षा के अनुसार व्यवहार करती है, और जब मैं दूसरी स्थिति को एक ही काम करने के लिए प्रेरित करता हूं, तो यह नहीं होता है।

यह बहुत ही मूल सामग्री है, लेकिन शर्म की बात है कि मैं यह नहीं देख सकता कि मैं क्या गलत कर रहा हूं।


क्या आप उदाहरण डेटा और अपेक्षित परिणाम बनाम वास्तविक परिणाम पोस्ट कर सकते हैं?
गैरेथ लियोन्स

6
जैसा कि लेनार्ड ने अपने जवाब में कहा, यह डी मॉर्गन नियमों का एक उदाहरण है: नहीं (ए और बी) = (ए नहीं) या (बी नहीं) , नहीं (ए या बी) = (ए नहीं) और (बी नहीं) । NULL मानों से सावधान रहें।
बैरनका

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

बूलियन बीजगणित अभिव्यक्तियों के लिए तुल्यता साबित / बाधित करने के लिए एक अच्छी तकनीक डोमेन के लिए एक cte का उपयोग करना है, और भावों की तुलना करना है:

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

संपादित करें: चूंकि DB2 बूलियन डेटाटाइप का समर्थन नहीं करता है, इसलिए मैंने इस उदाहरण का विस्तार किया:

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। प्रोग्रामिंग / स्क्रिप्टिंग के किसी भी रूप में किसी को पढ़ने के लिए आवश्यक होना चाहिए।
टन

लेकिन NULL का क्या?
dan04

@ dan04 आप NULL को पहली पंक्ति में जोड़ सकते हैं ( with T(a) as ( values 0,1,NULL )क्वेरी बन जाता है और पुनः चला सकते हैं और आप देखेंगे कि क्या हुआ है। NULLs निश्चित रूप से हमारे द्वारा सीखे गए अधिकांश सेट समकक्षता नियमों में एक रिंच फेंकते हैं। लघु उत्तर a = NULL और a है। > NULL दोनों की उपज NULL है, इसलिए वे दूसरे मामले में पड़ेंगे। आगे पढ़ने के लिए: ( stackoverflow.com/questions/1833949/… )
ब्रायन जे

मैं अनिश्चित हूं कि आपको DB2 के लिए पहले उदाहरण में संशोधन क्यों करना पड़ा। यह मेरे लिए दिखाए गए अनुसार काम करता है। मैं DB2 LUW के बजाय DB2 का उपयोग कर रहा हूँ। दूसरे उदाहरण में i के लिए DB2 के लिए कुछ सिंटैक्स त्रुटियां हैं।
jmarkmurphy

@jmarkmurphy, मुझे मेरे लिए DB2 नहीं पता, शायद यह वहां काम करता है। LUW के लिए केस एक्सप्रेशन मैप्स या तो 0 या 1 के लिए होता है, ताकि null को भी शामिल किया जा सके। ऐसा करने से मामले की अभिव्यक्ति अब तुच्छ नहीं है (आईएमओ), और अभिव्यक्ति के बारे में तर्क करना मुश्किल हो जाता है।
लेन्नर्ट

9

आपका पहला उदाहरण कह रहा है:

उन सभी पंक्तियों को लौटाएँ, जहाँ दोनों एक = 1 और b = 1 को छोड़कर

आपका दूसरा उदाहरण कह रहा है:

सभी पंक्तियों को वापस छोड़ दें जहां या तो = 1 या b = 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"या तो = 1 या b = 1" का अनुवाद क्यों किया जाता है?
डबल

1
@ double1ejack, आपको अपने दूसरे स्टेटमेंट में इसे पहले के बराबर बनाने के लिए एक अतिरिक्त नकार की आवश्यकता है 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
@ double1ejack "कार लाल है और चार दरवाजे हैं" के विपरीत है "या तो कार लाल नहीं है, या इसमें चार दरवाजे नहीं हैं।" यदि किसी कथन को सत्य बनाने के लिए कई चीजों को सच करना है, तो उसे गलत बनाने के लिए उनमें से केवल एक को झूठा होना चाहिए।
होब्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.