SQL Logic Operator Precedence : And and Or


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
TT F. (T 또는 T) 및 F. T 또는 (T 및 F)를 시도하십시오. 코드 리더는 코드 작성자의 의도를 명확하게 볼 수 있어야합니다. 그리고 작가는 기계가 의도 한대로 작동하고 있는지 확인해야합니다. 괄호는 리더, 라이터 및 기계의 세 가지를 모두 정렬합니다. :)
Assad Ebrahim

답변:


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
필요하지 않더라도 괄호를 사용하는 것이 좋습니다. 사용 가능한 모든 연산자의 우선 순위를 알고있는 프로그래머는 거의 없습니다.
Trismegistos

1
@Trismegistos 그렇게 되었으면 좋겠다 ... 그렇게해서는 안되지만, 당신이 옳은 것 같아요.
Charles Bretana

1
AND다음 OR우선 순위는 SQL 표준의 일부인가?
Jaime Hablutzel

@Jaime, 예, 그리고 afaik은 모든 프로그래밍 언어의 표준이기도합니다.
Charles Bretana

4
@Bsienn, 당신이 무엇을했는지 확실하지 않지만 표준 SQL 및 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 점을 추가 할 것입니다 :

  • "IN"은 효과적으로 괄호로 묶인 연속 OR입니다.
  • 내가 아는 모든 언어에서 OR보다 우선합니다.

따라서 두 표현은 동일하지 않습니다.

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 절을 분리하면 직렬 OR이 분할되고 우선 순위가 변경됩니다.


gbn ORACLE SQL에 연관성이 있습니까? 그렇다면 모든 운영자 연관성을 어떻게, 어디서 얻을 수 있습니까?
Asif Mushtaq

2
루비에서 OR보다 우선 순위가 높지 않습니다! 설상가상으로 && ||보다 우선합니다! 루비가 마음에 들지 않는 이유 중 하나는 저에게 놀랍게도 최소한의 원칙을 위반하는 것입니다. 2.2.1 : 007> 참 또는 참 및 거짓 => 거짓 2.2.1 : 008> 참 || 참 && 거짓 => 참
Alex L

23
  1. 산술 연산자
  2. 연결 연산자
  3. 비교 조건
  4. [없음] NULL, [아니요] 입력
  5. [아니오] 사이
  6. 같지 않음
  7. 비논리적 조건
  8. AND 논리적 조건
  9. OR 논리 조건

괄호를 사용하여 우선 순위 규칙을 무시할 수 있습니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.