복붙노트

[SQL] SQL Server의 이상한 작동 문제 : -100 / -100 * 10 = 0

SQL

SQL Server의 이상한 작동 문제 : -100 / -100 * 10 = 0

텅스텐 고정자 :

Level   Operators
  1     ~ (Bitwise NOT)
  2     * (Multiplication), / (Division), % (Modulus)
  3     + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)

BOL의 잘못인가, 아니면 내가 뭔가를 놓친 거지? 끄기 (예상) 우선 순위를 던지고있다 - 보인다.

해결법

  1. ==============================

    1.우선 순위 테이블에 따르면, 이것은 예상 된 동작입니다. 높은 우선 순위 (및 / *)와 오퍼레이터는 낮은 우선 순위가 조작으로 평가된다 (단항 -). 그래서 이거:

    우선 순위 테이블에 따르면, 이것은 예상 된 동작입니다. 높은 우선 순위 (및 / *)와 오퍼레이터는 낮은 우선 순위가 조작으로 평가된다 (단항 -). 그래서 이거:

    -100 / -100 * 10
    

    로 평가된다 :

    -(100 / -(100 * 10))
    

    참고이 동작은 단항 부정은 예를 들어, 곱셈과 나눗셈보다 더 높은 우선 순위를 가지고 있습니다 대부분의 프로그래밍 언어에서 다른 것을 VB, 자바 스크립트.

  2. ==============================

    2.BOL은 올바른 것입니다. - 그래서, *보다 낮은 우선 순위가

    BOL은 올바른 것입니다. - 그래서, *보다 낮은 우선 순위가

    -A * B
    

    로 해석됩니다

    -(A * B)
    

    / 그리고 % (그리고 %는 거의 같은 화합물 표현에 사용되지 않음) : 곱셈 그것이 무엇인지되고, 일반적으로 동일한 우선 순위가 다른 두 이항 연산자에 혼합하는 경우를 제외하고,이 통지하지 않습니다. 그래서

    C / -A * B
    

    로 해석됩니다

    C / -(A * B)
    

    결과를 설명. 대부분의 다른 언어로, 단항 마이너스 * 및 / 있지만에서 T-SQL보다 더 높은 우선 순위를 가지고 있으며, 이것이 제대로 설명되어 있기 때문에 반 직관적이다.

    (?) 좋은 방법은 그것을 설명하기 :

    SELECT -1073741824 * 2
    

    생성 산술 오버플 때문에 - (2 * 1073741824), 지능에 맞지 않는, 중간체로서 2147483648를 생성하지만

    SELECT (-1073741824) * 2
    

    예상되는 결과를 생성 -2147483648, 수행한다.

  3. ==============================

    3.(부정적인) 세 번째 - (아마도 반 직관적)에 대한 우선 순위가있는 설명서의주의 사항.

    (부정적인) 세 번째 - (아마도 반 직관적)에 대한 우선 순위가있는 설명서의주의 사항.

    효과적으로 얻을 수 있도록 :

    -(100/-(100*10)) = 0

    당신이 변수로 배치하면 곱셈 이후에 발생에는 단항 연산이 없기 때문에 당신은 이런 일을 볼 수 없습니다.

    그래서 여기에 A와 B는 (E가 전체 브라케팅을 갖는) C, D 반면, 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
    
  4. from https://stackoverflow.com/questions/54513450/a-strange-operation-problem-in-sql-server-100-10010-0 by cc-by-sa and MIT license