SQL लॉजिक ऑपरेटर प्राथमिकता: और


179

क्या नीचे दिए गए दो कथन समान हैं?

SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr

तथा

SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr

सत्य तालिका के कुछ प्रकार है जो मैं इसे सत्यापित करने के लिए उपयोग कर सकता हूं?


4
कोशिश करें: टीटी एफ (टी या टी) और एफ टी या (टी और एफ)। कोड के पाठक को स्पष्ट रूप से कोड के लेखक के इरादे को देखने में सक्षम होना चाहिए। और लेखक को यह सुनिश्चित करने की आवश्यकता है कि मशीन वही कर रही है जो उसने इरादा किया था। कोष्ठक तीनों को संरेखित करता है: पाठक, लेखक और मशीन। :)
असद अब्राहिम

जवाबों:


290

Andपहले से अधिक है Or, इसलिए, भले हीa <=> a1 Or a2

Where a And b 

जैसा है वैसा नहीं है

Where a1 Or a2 And b,

क्योंकि उस के रूप में निष्पादित किया जाएगा

Where a1 Or (a2 And b)

और जो आप चाहते हैं, उन्हें समान बनाने के लिए, निम्नलिखित है (पूर्ववर्ती नियमों को ओवरराइड करने के लिए कोष्ठक का उपयोग करके):

 Where (a1 Or a2) And b

यहाँ एक उदाहरण दिया गया है:

Declare @x tinyInt = 1
Declare @y tinyInt = 0
Declare @z tinyInt = 0

Select Case When @x=1 OR @y=1 And @z=1 Then 'T' Else 'F' End -- outputs T
Select Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- outputs F

उन लोगों के लिए जो संदर्भों की सलाह लेना पसंद करते हैं (वर्णानुक्रम में):


18
यदि आवश्यक न हो तो भी कोष्ठक का उपयोग करना अच्छा है। बहुत कम प्रोग्रामर (यदि हो तो) उपलब्ध सभी ऑपरेटरों की पूर्वता जानते हैं।
ट्रिस्मेगिस्टोस

1
@Trismegistos काश ऐसा नहीं होता ... ऐसा नहीं होना चाहिए, लेकिन मुझे लगता है कि आप सही हैं।
चार्ल्स ब्रेटाना

1
यह ANDतो ORपूर्वता SQL मानक का हिस्सा है?
Jaime Hablutzel

@ जयम, यस, एंड, एफैक, यह भी सभी प्रोग्रामिंग भाषाओं के लिए मानक का हिस्सा है।
चार्ल्स ब्रेटाना

4
@ बाइस, निश्चित नहीं कि आपने क्या किया, लेकिन वह मानक एसक्यूएल के साथ और MySQL प्रलेखन के साथ असंगत है ... dev.mysql.com/doc/refman/5.0/en/operator-precedence.html आपको फिर से प्रयास करना चाहिए, - सावधानी से समय ... कोशिश declare @x tinyInt = 1 declare @y tinyInt = 0 declare @z tinyInt = 0 select case when @x=1 or @y=1 and @z=1 then'T' else 'F' end select case when (@x=1 or @y=1) and @z=1 then'T' else 'F' end
चार्ल्स ब्रेटाना

33

मैं 2 अंक जोड़ूंगा:

  • "इन" प्रभावी रूप से उनके साथ कोष्ठक के साथ ओआरएस है
  • और मुझे पता है कि हर भाषा में या पर पूर्वता है

तो, 2 भाव समान नहीं हैं।

WHERE some_col in (1,2,3,4,5) AND some_other_expr
--to the optimiser is this
WHERE
     (
     some_col = 1 OR
     some_col = 2 OR 
     some_col = 3 OR 
     some_col = 4 OR 
     some_col = 5
     )
     AND
     some_other_expr

इसलिए, जब आप IN खंड को तोड़ते हैं, तो आप धारावाहिक ORs को विभाजित करते हैं, और पूर्ववर्तीता को बदल देते हैं।


gbn क्या ORACLE SQL में संबद्धता है? यदि हाँ, तो मैं कैसे और कहाँ से सभी ऑपरेटरों की संगति कर सकता हूँ?
आसिफ मुश्ताक

2
जितना यह कहने के लिए मुझे दर्द होता है, और रूबी में या पर पूर्वता नहीं है! चीजों को बदतर बनाने के लिए, && पर पूर्वताप होती है || माणिक को पसंद नहीं करने के कारणों में से एक - यह मेरे लिए कम से कम विस्मय के सिद्धांत का उल्लंघन करता है। २.२.१: ००>> सत्य या सत्य और असत्य => असत्य २.२.१: ०० true> सत्य || true && false => सच
एलेक्स एल

23
  1. अंकगणितीय आपरेटर
  2. सांत्वना देनेवाला संचालक
  3. तुलना की स्थिति
  4. IS [नहीं] NULL, LIKE, [NOT] IN
  5. [बीच में नहीं
  6. बराबर नही है
  7. तार्किक स्थिति नहीं
  8. और तार्किक स्थिति
  9. या तार्किक स्थिति

आप वरीयता के नियमों को ओवरराइड करने के लिए कोष्ठक का उपयोग कर सकते हैं।


9

एक 3-चर बूलियन अभिव्यक्ति सत्य तालिका दिखाने की क्वेरी:

;WITH cteData AS
(SELECT 0 AS A, 0 AS B, 0 AS C
UNION ALL SELECT 0,0,1
UNION ALL SELECT 0,1,0
UNION ALL SELECT 0,1,1
UNION ALL SELECT 1,0,0
UNION ALL SELECT 1,0,1
UNION ALL SELECT 1,1,0
UNION ALL SELECT 1,1,1
)
SELECT cteData.*,
    CASE WHEN

(A=1) OR (B=1) AND (C=1)

    THEN 'True' ELSE 'False' END AS Result
FROM cteData

के लिए परिणाम (A=1) OR (B=1) AND (C=1):

A   B   C   Result
0   0   0   False
0   0   1   False
0   1   0   False
0   1   1   True
1   0   0   True
1   0   1   True
1   1   0   True
1   1   1   True

के लिए परिणाम (A=1) OR ( (B=1) AND (C=1) )समान हैं।

के लिए परिणाम ( (A=1) OR (B=1) ) AND (C=1):

A   B   C   Result
0   0   0   False
0   0   1   False
0   1   0   False
0   1   1   True
1   0   0   False
1   0   1   True
1   1   0   False
1   1   1   True
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.