문제

아래의 두 진술은 동일합니까?

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를 쪼개고 우선 순위가 바뀌 었습니다.

  1. 산술 연산자
  2. 연결 연산자
  3. 비교 조건
  4. NOT] NULL, LIKE, [NOT
  5. 아님] 사이
  6. 동일하지 않습니다
  7. 논리적 조건이 아닙니다
  8. 그리고 논리적 조건
  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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top