반응형
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
참고 문헌을 참조하고 싶은 사람(알파벳 순):
- Microsoft Transact-SQL 운영자 우선 순위
- Oracle MySQL 9 운영자 우선 순위
- Oracle 10g 조건 우선 순위
- PostgreSQL 연산자 우선 순위
- SQLite에서 이해하는 SQL
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을 분할하고 우선 순위를 변경합니다.
- 연산자
- 연결 연산자
- 비교조건
- [NOT] Null, LIKE, [NOT] 입력
- [없음] 사이에
- 같지 않음
- 논리적 조건이 아님
- AND 논리 조건
- 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
반응형
'programing' 카테고리의 다른 글
PowerShell에서 보안 FTP를 자동화하는 가장 좋은 방법은 무엇입니까? (0) | 2023.09.03 |
---|---|
전화기의 Google Play 스토어 앱에서 "Rate This App" 링크 (0) | 2023.09.03 |
파워셸:명령줄에서 powershell을 호출할 때 변수를 스위치 매개 변수로 전달하려면 어떻게 해야 합니까? (0) | 2023.09.03 |
UITableView 스크롤 위치를 저장하려면 어떻게 해야 합니까? (0) | 2023.09.03 |
PHP 코드 내에서 MySQL 저장 프로시저를 어떻게 호출합니까? (0) | 2023.09.03 |