2016-09-27 9 views
1

에는 VARCHAR으로 정의 된 열 집합이 있습니다. 값은 메트릭에 대한 임계 값이며 숫자 또는 문자열 값이 될 수 있습니다. 예를 들어 온도 임계 값은 0100이며 문에 대한 임계 값은 openclosed입니다.문자열을 정수로 비교하는 방법

두 개의 임계 값 ([Value_Threshold_min][Value_Threshold_max]) 사이에 값이 있는지 확인하려면 [ResponseValue] 값을 테스트하고 싶습니다. [ResponseValue]NUMERIC 또는 VARCHAR 일 수 있지만 항상 VARCHAR으로 저장됩니다. Threshold_max/minVARCHAR으로 저장됩니다.

SELECT responsevalue 
     , (CASE WHEN ResponseValue BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max else END THEN column_color 
FROM steps 
JOIN responses on responses.stepid = steps.id 
WHERE stepid = 4447 

숫자 값을 올바르게 테스트하지 못합니다. 예를 들어, 12는 문자열로 평가되기 때문에 100에서 200 사이라고합니다.

값이 숫자인지 확인하고 값이 int 인 경우 int로 캐스팅하려고했지만 값이 알파 숫자 일 때마다 실패합니다.

CASE WHEN isnumeric([Responses].[ResponseValue]) = 1 
THEN CAST([Responses].[ResponseValue] as int) 
ELSE [Responses].[ResponseValue] END) 
BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max THEN column _color 

비교할 때 숫자를 숫자로, 문자열을 문자열로 처리하려면 어떻게해야합니까? 일부 값은 문자열과 일부의 int가있는 경우는, 문제가 발생할 수 있습니다

SELECT responsevalue, 
     (CASE WHEN r.ResponseValue BETWEEN convert(int, s.value_threshold_min) AND convert(int, s.Value_Threshold_max) 
       ELSE . . . 
     END) column_color 
FROM steps s JOIN 
    responses r 
    on r.stepid = s.id 
WHERE stepid = 4447; 

-이조차 할 수 있습니다

+0

버전을 2008 년, 2012 년 등 2012 – scsimon

+0

SQL 서버)' ISNUMERIC 대신에. 'ISNUMERIC'은 위양성을 유발할 수 있습니다. 즉'SELECT ISNUMERIC ('1e4')'시도 –

+0

그런 다음 확실히'TRY_CONVERT를 (사용 – scsimon

답변

0
SELECT responsevalue, 
    CASE 
     WHEN TRY_CONVERT(INT,ResponseValue) BETWEEN TRY_CONVERT(INT,steps.value_threshold_min) AND TRY_CONVERT(INT,steps.Value_Threshold_max) THEN 'Int Color' 
     WHEN ResponseValue BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max THEN 'VarcharColor' 
     ELSE NULL 
    END as column_color 
FROM steps 
JOIN responses on responses.stepid = steps.id 
WHERE stepid = 4447 
+0

이것은 위대한 작품! 솔루션을 가져 주셔서 감사합니다. –

+0

걱정하지 마세요 @DavidWinslow – scsimon

0

당신이 값이 유효 자리입니다을 알고 있다면 글쎄, 당신은 단지 그들을 변환 할 수 있습니다 질의에 의해 선택되지 않는 행에서 발생합니다. 이 문제의 경우, SQL 서버 2012+, 당신은 try_convert()을 사용할 수 있습니다 : SQL의

SELECT responsevalue, 
     (CASE WHEN r.ResponseValue BETWEEN try_convert(int, s.value_threshold_min) AND try_convert(int, s.Value_Threshold_max) 
       ELSE . . . 
     END) column_color 
FROM steps s JOIN 
    responses r 
    on r.stepid = s.id 
WHERE stepid = 4447; 
+0

isnumeric과 같은 오류가납니다. varchar 값 'Yes'를 데이터 유형 int로 변환 할 때 변환이 실패했습니다. [SQL 상태 = S0001, DB Errorcode = 245]. responseValue의 값은 숫자 또는 문자열 일 수 있습니다. 숫자 일 때, "between"함수를 숫자로 취급해야합니다. 일부 값은 문자열이기 때문에 숫자와 같은 모든 것을 다룰 수는 없습니다. –

+0

@DavidWinslow. . . 내가 추천 한대로'try_convert()'를 사용 했습니까? –

+0

@GordonLinoff 나는 그것이 responsevalue 칼럼에 있다고 생각하지만 틀릴 수도있다 – scsimon

관련 문제