SQL 로직 연산자 우선 순위 : 및 또는
-
12-09-2019 - |
문제
아래의 두 진술은 동일합니까?
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"은 효과적으로 연쇄 ors가 주변에 괄호 안에 있습니다.
- 그리고 내가 아는 모든 언어보다 우선합니다.
따라서 두 표현은 단순히 동일하지 않습니다.
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 in in in on in in in all ors를 쪼개고 우선 순위가 바뀌 었습니다.
- 산술 연산자
- 연결 연산자
- 비교 조건
- NOT] NULL, LIKE, [NOT
- 아님] 사이
- 동일하지 않습니다
- 논리적 조건이 아닙니다
- 그리고 논리적 조건
- 또는 논리적 조건
괄호를 사용하여 우선 순위의 규칙을 무시할 수 있습니다.
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
제휴하지 않습니다 StackOverflow