아래의 두 진술은 동등합니까?
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이 분할되고 우선 순위가 변경됩니다.
답변
- 산술 연산자
- 연결 연산자
- 비교 조건
- [없음] NULL, [아니요] 입력
- [아니오] 사이
- 같지 않음
- 비논리적 조건
- AND 논리적 조건
- OR 논리 조건
괄호를 사용하여 우선 순위 규칙을 무시할 수 있습니다.
답변
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
답변
