[sql] SQL Server의 이상한 작업 문제 : -100 / -100 * 10 = 0
- 실행
SELECT -100/-100*10
하면 결과는0
. - 실행
SELECT (-100/-100)*10
하면 결과는10
. - 실행
SELECT -100/(-100*10)
하면 결과는0
. - 실행
SELECT 100/100*10
하면 결과는10
.
BOL 상태 :
식에서 두 연산자의 연산자 우선 순위 수준이 같으면 식에서의 위치를 기준으로 왼쪽에서 오른쪽으로 평가됩니다.
과
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
BOL이 잘못되었거나 내가 뭔가를 놓치고 있습니까? -
(예상 된) 우선 순위를 버리는 것 같습니다 .
답변
우선 순위 테이블에 따르면,이 입니다 예상되는 동작. 우선 순위가 더 높은 연산자 ( /
및 *
)는 우선 순위가 낮은 연산자 (단항 -
) 보다 먼저 평가 됩니다. 그래서 이거:
-100 / -100 * 10
다음과 같이 평가됩니다.
-(100 / -(100 * 10))
이 동작은 단항 부정이 곱셈 및 나눗셈보다 우선하는 대부분의 프로그래밍 언어 (예 : VB , JavaScript )와는 다릅니다 .
답변
BOL이 맞습니다. -
보다 우선 순위가 낮 *
으므로
-A * B
다음과 같이 구문 분석됩니다.
-(A * B)
: 곱셈 그것이 무엇인지되고, 일반적으로 동일한 우선 순위가 다른 두 이항 연산자에 혼합하는 경우를 제외하고,이 통지를하지 않습니다 /
와 %
(과 %
거의 같은 화합물 표현식에서 사용되지 않습니다). 그래서
C / -A * B
다음과 같이 구문 분석됩니다.
C / -(A * B)
결과를 설명합니다. 대부분의 다른 언어에서 단항 마이너스가 *
및 보다 우선 순위가 높지만 /
T-SQL에서는 그렇지 않기 때문에 이것은 직관적이지 않습니다.
그것을 설명하는 좋은 (?) 방법 :
SELECT -1073741824 * 2
에 맞지 않는 중간으로 -(1073741824 * 2)
생성 하기 때문에 산술 오버플로를 생성 하지만2147483648
INT
SELECT (-1073741824) * 2
예상되는 결과를 생성합니다 -2147483648
.
답변
문서에서 (아마도 직관에 반하는) 우선 순위 - (Negative)
가 세 번째라는 것을 알 수 있습니다.
따라서 효과적으로 다음을 얻을 수 있습니다.
-(100/-(100*10)) = 0
변수에 배치하면 곱셈 후에 발생하는 단항 연산이 없기 때문에 이런 일이 발생하지 않습니다.
따라서 여기 A와 B는 동일하지만 C, D, E는 현재보고있는 결과를 보여줍니다 (E는 완전한 브라케팅을 가짐).
DECLARE @i1 int, @i2 int, @i3 int;
SELECT @i1 = -100,
@i2 = -100,
@i3 = 10;
SELECT @i1/@i2*@i3 [A],
-100/(-100)*10 [B],
-100/-100*10 [C],
-100/-(100*10) [D],
-(100/-(100*10)) [E];
A - 10
B - 10
C - 0
D - 0
E - 0