2016-08-11 2 views
0

다음 시나리오를 사용하는 스크립트가 있습니다.SQL Server - 사례 식 및 숫자 서식

이상한 일은 SQL이 모든 결과를 10 진수 18,1로 변환한다는 것입니다. 심지어 int로 캐스팅되어야하는 metricid 1 레코드.

SELECT CASE 

    WHEN metricid = 1 then cast(result as int) 
    WHEN metricid = 2 then cast(result as decimal(18,1) 

    END as column1 
    from sometable 

것은 난 평가해서는 안 두 번째 조건으로 다음과 같은 것을 추가 1 않기 때문에하지 = 3 (오른쪽?)하지만 여전히 소수에 대한 모든 결과 변환 :

WHEN 1=3 and metricid = 2 then cast(result as decimal(18,1) 

을 나는 SQL을 .... :(

+4

에만 열 당 하나의 데이터 타입을 가질 수 있습니다. 'column1'은 하나의 열입니다. – Blorgbeard

+0

이상한 점이 없다. 하나의 열은 하나의 데이터 유형 만 가질 수있다. – Lamak

+1

* 문의 *와 * 표현 * 사이의 차이점을 이해하면 도움이 될 것이다. 당신이 사용하는 것은'CASE' * 표현식 *입니다. 모든 표현식과 마찬가지로 하나의 값 (행당)을 반환합니다. –

답변

4

SQL은 하나의 열에서 하나 개의 데이터 유형을 허용 파산 생각 가능한 솔루션 VARCHAR에 출력을 변환 할 수 있습니다 예를 들어, 다음 예제를 고려하십시오..

DECLARE @metricid INT 
DECLARE @result INT 

SET @metricid = 2 --(or 1) 
SET @result = 20 

SELECT CASE WHEN @metricid = 1 then CAST(CAST(@result as int) AS VARCHAR(55)) 
      WHEN @metricid = 2 then CAST(CAST(@result as decimal(18,1)) AS VARCHAR(55)) 
      ELSE '' 
     END Result 

The return type 사례 식은 result_expressions 및 선택적인 else_result_expression의 유형 집합 중에서 가장 높은 우선 순위 유형입니다. 데이터 형식의 우선 순위는 here에서 확인할 수 있습니다.

SQL-서버 2012 +

SELECT CASE WHEN @metricid = 1 then FORMAT(@result, '#') 
      WHEN @metricid = 2 then FORMAT(@result, '#.0') 
      ELSE '' 
     END Result 
+2

THEN FORMAT (결과, '#') 그리고 그 다음 FORMAT (결과, '#. 0')은 SQL 2012 이상에서 잘 작동하고 코드 작성은 덜합니다 – Matt

+1

감사합니다. 최종 출력을 varchar로 변환하고 있지만 케이스 내부의 각 인스턴스는 변환하지 않았습니다! 너 대 남자. +1 (우선 순위 정보는 "SQL이 작동하는 방식"이라고 말하는 대신에). 나는 그것이 우선 순위와 관련이 있다고 생각했다. 왜 다른 데이터 타입보다 하나의 데이터 타입을 선택 했는가. –

+0

@Matt - 나는 'FORMAT'을 사용하고 싶다. 내 답변을 편집하고 'SQL Server 2012'제목 아래에 코드를 삽입하십시오. 나는 아직 그 버전을 가지고 있지 않아서 당신의 대답을 훔치는 것이 적절하지 않습니다. – techspider