programing

SQL Logic 연산자 우선 순위:And 및 Or

goodsources 2023. 9. 3. 16:15
반응형

SQL Logic 연산자 우선 순위:And 및 Or

아래의 두 문장이 동등합니까?

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

이것을 확인하는 데 사용할 수 있는 진실한 표가 있습니까?

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

참고 문헌을 참조하고 싶은 사람(알파벳 순):

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을 분할하고 우선 순위를 변경합니다.

  1. 연산자
  2. 연결 연산자
  3. 비교조건
  4. [NOT] Null, LIKE, [NOT] 입력
  5. [없음] 사이에
  6. 같지 않음
  7. 논리적 조건이 아님
  8. AND 논리 조건
  9. OR 논리적 조건

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

3변수 부울식 True 테이블을 표시하기 위한 쿼리:

;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

다음은 불리언을 사용한 '3변수 진리표'의 변형입니다.

WITH truth_values AS
  (SELECT FALSE AS A,        
          FALSE AS B,
          FALSE AS C
   UNION ALL SELECT FALSE,
                    FALSE,
                    TRUE
   UNION ALL SELECT FALSE,
                    TRUE,
                    FALSE
   UNION ALL SELECT FALSE,
                    TRUE,
                    TRUE
   UNION ALL SELECT TRUE,
                    FALSE,
                    FALSE
   UNION ALL SELECT TRUE,
                    FALSE,
                    TRUE
   UNION ALL SELECT TRUE,
                    TRUE,
                    FALSE
   UNION ALL SELECT TRUE,
                    TRUE,
                    TRUE),
     logics AS
  (SELECT truth_values.*,
          a
   OR b
   AND c AS no_parens, (a
                        OR b)
   AND c AS or_parens
   FROM truth_values)
SELECT *,
       no_parens != or_parens AS parens_made_a_difference
FROM logics
ORDER BY a,
         b,
         c

다음 결과를 사용합니다.

# A B C 부모가 아닌 또는_부모님 부모의 차이
1 거짓의 거짓의 거짓의 거짓의 거짓의 거짓의
2 거짓의 거짓의 진실의 거짓의 거짓의 거짓의
3 거짓의 진실의 거짓의 거짓의 거짓의 거짓의
4 거짓의 진실의 진실의 진실의 진실의 거짓의
5 진실의 거짓의 거짓의 진실의 거짓의 진실의
6 진실의 거짓의 진실의 진실의 진실의 거짓의
7 진실의 진실의 거짓의 진실의 거짓의 진실의
8 진실의 진실의 진실의 진실의 진실의 거짓의

'paren_made_a_difference'가 참이면 괄호 안에 차이가 있습니다.

언급URL : https://stackoverflow.com/questions/1241142/sql-logic-operator-precedence-and-and-or

반응형