SQL

SQL서버 사칙연산

0
안녕하세요,oracle, mysql 에서는 select 1000.0 * -1 / 10 하면결과가 -100 으로 나오는데이상하게 SQL서버에서는 0 이 됩니다.MS 문서상에 보면 곱하기, 나누기가 음수(-) 연산자 보다 우선순위가 높고, 동일 우선순위 연산자의 경우..

안녕하세요,

oracle, mysql 에서는

select 1000.0 * -1 / 10 하면

결과가 -100 으로 나오는데

이상하게 SQL서버에서는 0 이 됩니다.

MS 문서상에 보면 곱하기, 나누기가 음수(-) 연산자 보다

우선순위가 높고, 동일 우선순위 연산자의 경우는 좌에서 우로 계산 된다고 하는데

마치 SQL 서버는 select 1000.0 * (-1 / 10) 와 같이 연산이 된 거 같은데

그 이유를 모르겠습니다.

해나 2018-06-12
+
해나 님께서 2018-06-12에 SQL에 올린 질문

댓글

1개의 답변

0
MS SQL에서는 Integer끼리 나눈 결과가 0보다 작으면 무조건 0을 반환하고, 0보다 크면 무조건 소수점 뒷자리를 잘라서 Integer로 반환합니다.즉, 다음과 같이 쿼리를 실행해도 무조건 0이 반환됩니다.select 3/4 또한 다음과 같이 실..

MS SQL에서는 Integer끼리 나눈 결과가 0보다 작으면 무조건 0을 반환하고, 0보다 크면 무조건 소수점 뒷자리를 잘라서 Integer로 반환합니다.

즉, 다음과 같이 쿼리를 실행해도 무조건 0이 반환됩니다.

select 3/4 

또한 다음과 같이 실행하면 소수점 뒷자리를 잘라서 1이 반환됩니다.

select 4/3

따라서 원하시는 결과를 얻으시려면 다음과 같이 float 타입이 들어간 상태에서 나누도록 해주시면 됩니다.

select 1000.0 * -1.0 / 10

즉, Integer끼리만 나누지 않도록 해주시면 됩니다.

그럼 답변이 되셨길 바라며 또 궁금한 사항이 있으시면 언제든지 질문 남겨주시기 바랍니다.

감사합니다.

sqlserver mssql
kimho 2018-06-12
+
사탕 주기
kimho 님께서 2018-06-12에 SQL에 올린 글
보관하기
0
 
해나 2018-06-12
답변 감사 드립니다.
그런데 제가 드리는 질문은 연산자 우선순위가 select (1000.0 * -1) / 10 가 아닌
왜 select 1000.0 * (-1 / 10) 로 처리 되었는가 하는 것 입니다.
곱하기와 나누기는 동일한 연산순위를 가지므로 왼쪽에서 오른쪽으로 계산 되어야 하는것 아닌지요?
0
 
kimho 2018-06-12
@해나.
현재 왼쪽에서 오른쪽으로 계산되어진 것이 맞습니다.
1000.0을 -1.0으로 곱하니까 -1000.00이 되고 그걸 10으로 나눠서 결과는 -100.0000 이 나오는 것입니다.
실행해보시면 -100.0000과 같은 형태로 출력이 되는 것을 보실 수 있습니다.
0
 
kimho 2018-06-12
@해나.
처음에 0이 나온 이유는 오른쪽부터 계산해서가 아니라 앞서 답변드린 내용처럼 Integer끼리 나누었기 때문에 0이 출력된 것입니다.
0
 
해나 2018-06-12
@kimho

1000.0 * -1 / 10 가
① 1000.0 * -1 => - 10000.0
② - 10000.0 / 10 => -100.0
이렇게 되어야 하는데,

① -1 / 10 => 0
② 1000.0 * 0 => 0
와 같이 계산이 되고 있습니다.
왜 괄호 연산을 하지 않았는데 나눗셈이 먼저 되었는지가 궁금 한 것입니다.
0
 
kimho 2018-06-12
@해나
네. 앞서 답변드린 내용에서 보시면,
1000.0 * -1 / 10 으로 쓰시면 안되고, 1000.0 * -1.0 / 10 처럼 -1.0 이라고 소수점이 붙은 float 형태로 써주셔야 합니다.
select 1000.0 * -1.0 / 10 이라고 소수점이 붙은 형태로 실행해보시기 바랍니다.
감사합니다.
0
 
해나 2018-06-12
@kimho

kimho님께서 무슨 말씀 하시는 지는 잘 알겠습니다.
그런데 제 질문의 요지는 그게 아니라 왜 연산자 우선순위가 위에 질문 드린것 처럼 동작하지 않느냐 입니다(좌에서 우로).
그리고 이해를 쉽게 하기 위해 상수를 사용 했지만, 실제로는 정수형 데이터 타입의 컬럼을 사용 하는 것이며
컬럼 타입의 변경도 불가능 합니다 (물론 강제로 convert 하면 되겠지만 말씀 드린 것 처럼 질문의 요지가 그것이 아닙니다).
Oracle, MySQL은 똑같은 환경에서 좌 -> 우 순서로 연산이 되는데, 왜 SQL서버는 우 -> 좌로 연산이 되었냐하는 질문입니다.
감사합니다.
0
 
kimho 2018-06-12
@해나
원하시는 답변을 드리지 못해 죄송합니다.
편하실 때 사이트 아래의 "채팅 문의"를 통해 질문 주시면 좀 더 상세히 말씀드려보도록 하겠습니다.
감사합니다.

댓글

조회수 2,540
답글 1
URL