SQL Mantık Operatörü Önceliği: Ve Ve Veya


179

Aşağıdaki iki ifade eşdeğer midir?

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

ve

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

Bunu doğrulamak için kullanabileceğim bir çeşit doğruluk tablosu var mı?


4
Deneyin: TT F. (T veya T) ve F. T veya (T ve F). Kod okuyucusu, kod yazarının amacını açıkça görebilmelidir. Ve yazarın, makinenin istediklerini yaptığından emin olması gerekir. Parantezler üçünü de hizalar: okuyucu, yazar ve makine. :)
Esad Ebrahim

Yanıtlar:


290

Andönceliğe sahiptir Or, yani,a <=> a1 Or a2

Where a And b 

ile aynı değil

Where a1 Or a2 And b,

çünkü bu

Where a1 Or (a2 And b)

ve bunları yapmak için istediğiniz şey şudur (öncelik kurallarını geçersiz kılmak için parantez kullanmak):

 Where (a1 Or a2) And b

Aşağıda açıklamak için bir örnek verilmiştir:

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

Referanslara danışmak isteyenler için (alfabetik sırayla):


18
Gerekli olmasa bile parantez kullanmak iyi bir uygulamadır. çok az programcı (varsa) mevcut tüm operatörlerin önceliğini bilir.
Trismegistos

1
@Trismegistos Keşke öyle olmasaydı ... öyle olmamalı, ama haklı olduğunu tahmin ediyorum.
Charles Bretana

1
Bu ANDdaha sonra ORöncelik SQL standardının bir parçası mı?
Jaime Hablutzel

@Jaime, Yes ve afaik, aynı zamanda tüm programlama dilleri için standardın bir parçasıdır.
Charles Bretana

4
@Bsienn, Ne yaptığınızdan emin değilsiniz, ancak standart SQL ve MySQL belgeleriyle tutarsız ... dev.mysql.com/doc/refman/5.0/en/operator-precedence.html Tekrar denemelisiniz, - dikkatlice bu zaman ... deneyin 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
Charles Bretana

33

2 puan ekleyeceğim:

  • "IN", etraflarında parantez içeren etkin bir şekilde seri OR'ler
  • VE bildiğim her dilde VEYA'ya göre öncelikli

Dolayısıyla, 2 ifade eşit değildir.

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

Böylece, IN yan tümcesini kırdığınızda, seri OR'leri böler ve önceliği değiştirmiş olursunuz.


gbn ORACLE SQL'de ilişkilendirilebilirlik var mı? EVET EĞER İSE o zaman nasıl ve nerede tüm operatörlerin birlikteliğini alabilirim?
Asif Mushtaq

2
Söylemem beni üzüyor, VE yakutta VEYA'ya göre önceliği yok! Kötü şeyler yapmak için, && yapar || önceliklidir var! Yakutu sevmememin nedenlerinden biri - benim için en az şaşkınlık ilkesini ihlal ediyor. 2.2.1: 007> doğru veya doğru ve yanlış => yanlış 2.2.1: 008> doğru || true && false => true
Alex L

23
  1. Aritmetik operatörler
  2. Birleştirme operatörü
  3. Karşılaştırma koşulları
  4. [NOT] NULL, GİBİ, [NOT] IN
  5. [ARASINDA DEĞİL
  6. Eşit değil
  7. Mantıksal koşul DEĞİL
  8. VE mantıksal durum
  9. VEYA mantıksal koşul

Öncelik kurallarını geçersiz kılmak için parantez kullanabilirsiniz.


9

3 değişkenli bir boole ifadesi doğruluk tablosunu göstermek için sorgu:

;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

Sonuçlar (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

İçin sonuçlar (A=1) OR ( (B=1) AND (C=1) )aynı.

Sonuçlar ( (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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.