2016-09-19 3 views
3

다음과 같은 의미를 가진 열 SQL 변형이 있습니다. 100, 150, D1 특정 논리에 따라 열의 모든 숫자를 문자 (예 : D1)로 변환하려고합니다. 그러나 150에는 공백이 있고 CASE WHEN은 작동하지 않습니다. 여기 trim sql variant

내가 사용하고 쿼리의 :

Select *, 
     Case When LTrim(Cast(AttributeValue As NVarchar(Max))) Between 0 And 200 Then 'D1' 
      Else 'Other' 
     End 
From MyTable As SCR With (NoLock); 

나는 다음과 같은

LTRIM(CAST column AS VARCHAR(MAX)) 

시도했지만 지금은 얻을 오류 : 나는 SQL_VARIANT에서 공백을 제거하는 방법

Conversion failed when converting the nvarchar value 'D1' to data type int

? 때문에 더 큰 숫자를 데 BIGINT를 사용하여 열을 동일 떠날 편집 귀하의 의견으로 당

+0

전체 쿼리를 보여주십시오 (columnnName를, '', '') 교체를 선택 대체 :

여기 그것이 작동하는 방법을 보여주는 당신의 전체 예입니다. – Siyual

+0

SELECT *, CASE (CAST (AttributeValue AS NVARCHAR (MAX))) 0과 200 사이에 'D1'ELSE AttributeValue END MyTable AS SCR WITH (NOLOCK) – Asakura

+0

AFAIK에는 'variant' SQL 서버입니다! –

답변

4

그렇지 당신이 결정하는 ISNUMERIC() 기능을 사용할 수 있습니다

SELECT * 
    ,CASE 
     WHEN ISNUMERIC(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX)))) = 1 
      AND CAST(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX))) AS BIGINT) BETWEEN 0 AND 400 THEN 'D1' 
     ELSE AttributeValue 
    END 
FROM 
    MyTable AS SCR WITH (NOLOCK) 
0과 400 인 경우 sql_variants 어떤 정수이고 그렇지 않은 정수입니다.

코드가 실패하는 이유는 VARCHAR과 INTEGER를 비교하기 때문에 SQL이 자동으로 최종 문자열을 정수로 캐스팅하려고 시도하기 때문입니다. D1의 경우에는 그렇지 않습니다. 숫자로 변환 오류가 발생합니다.

함수에서 sql_variant을 직접 사용할 수 없으므로 먼저 varchar으로 전송하십시오.

DECLARE @MyTable AS TABLE (AttributeValue SQL_VARIANT) 
INSERT INTO @MyTable VALUES 
(CAST('  150' AS VARCHAR(100))) 
,(CAST('D1' AS VARCHAR(100))) 

SELECT * 
    ,CASE 
     WHEN ISNUMERIC(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX)))) = 1 
      AND CAST(LTRIM(CAST(AttributeValue AS NVARCHAR(MAX))) AS INT) BETWEEN 0 AND 200 THEN 'D1' 
     ELSE 'Other' 
    END 
FROM 
    @MyTable AS SCR 
+0

전체 쿼리를 올렸습니다. 어디에서 sql_variant 열에 공백이있는 숫자가있는 행을 선택하면 논리가 작동합니다. 하지만 'D2'와 같은 행을 선택하면 오류가 발생합니다. – Asakura

+0

@Asakura ISNUMERIC()을 사용하여 테스트하면 오류가 발생하거나 다른 오류가 발생하는 경우 가장 최근에 시도한 오류를 게시 할 수 있습니까? – Matt

+0

예, 감사합니다! 그러나 귀하의 답변에 따라 쿼리를 변경 한 후에 또 다른 문제가 발생했습니다. 이 열은 소프트웨어 사용자가 입력하므로 20001069307과 같은 이상한 값이 있으며 이제 오류가 발생합니다. nvarchar 값 '20001069307'의 변환이 int 열을 오버플로했습니다. 그것을위한 어떤 고침이 있습니까? – Asakura

-2

사용 SQL 기능 가

+0

replace를 사용할 때 인수 데이터 형식 sql_variant가 replace 함수의 인수 1에 대해 유효하지 않습니다. – Asakura

+0

@Asakura이 경우 데이터가 처음 숫자 일 경우 테스트해야하는 변환 문제에 도움이되지 않습니다. 이것은 공백을 제거하는 또 다른 방법 일 뿐이지 만,이 경우에는 모든 공백이 제거됩니다. 함수에서 sql_variant를 사용할 수 없으므로 대체 내부의 varchar에 열을 캐스팅해야합니다. 그러나 이것은 다시 2 downvotes가 왜 당신의 데이터 변환 오류와 함께 당신을 도울 수 없습니다 – Matt