2014-12-11 2 views
0

네트워크 인벤토리 시스템 LanSweeper에서 보고서 쿼리를 작성합니다. 내가 이루고자하는 것을 보여주기위한 최소한의 예입니다.정수가 아닌 값에서 CASE 사용

Select Distinct Top 1000000 tblAssets.AssetName, 
    (Select Case When tblRegistry.Value = 2 Then 'Notify Only' 
     When tblRegistry.Value = 3 Then 'Download Notify' 
     When tblRegistry.Value = 4 Then 'Scheduled' 
     When tblRegistry.Value = 5 Then 'Download and Custom' 
     Else tblRegistry.Value End As RegistryValue 
    From tblAssets As TA Left Join tblRegistry On tblRegistry.AssetID = TA.AssetID 
    Where tblRegistry.Valuename = 'AUoptions' And TA.AssetID = tblAssets.AssetID) 
    As AUOption 
From tblAssets 

문제는 해당 테이블 tblRegistry 나는 재고에 내 시스템을 말한 레지스트리 키와 값의 모음입니다. 다른 보고서에 대한 여러 개의 키를 재고 할 때마다 해당 테이블에 문자열과 정수가 혼합되어 있습니다. 나는 테이블에서 원하는 값을 끌어 당기는 데 문제가 없다. 내 문제는 숫자 값에 친숙한 문자열을 제공하는 데서 발생합니다. 위의 경우 Windows 컴퓨터의 자동 업데이트 설정입니다.

내가 갖는 오류 : 그것은 분명히 정수되지 않기 때문에

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

이 의미가 있습니다. 모든 tblRegistry.Value 년대 대신 WHERE clase Where tblRegistry.Valuename = 'AUoptions'

CASE 문에서 숫자가 아닌 값을 필터링 할 수있는 방법이 있나요 될 필터링되었을 사람들의 CASE에 의해 평가되고있는 것으로 보인다?

+3

'case ... when'에서 varchar를 사용하는 것이 어떻습니까? 'Case when tblRegistry.Value = '2'Then ... ' – B0Andrew

+0

'CAST (tblRegistry.Value AS INT) = 2'의 경우는 무엇입니까? – Icemanind

+0

'tblRegistry.Value'의 기본 데이터 유형은 무엇입니까? – Magnus

답변

1

따라서 tblRegistry.Valuenvarchar이지만 일부 값은 숫자입니다. case에 정수를 사용하면 DBMS를 사용자의 유형으로 강제 변환하지만 어떤 경우에는 가능하지 않습니다. 대신 varchar를 사용하면 문자열을 비교해야합니다.

Select Distinct Top 1000000 tblAssets.AssetName, 
(Select Case When tblRegistry.Value = '2' Then 'Notify Only' 
    When tblRegistry.Value = '3' Then 'Download Notify' 
    When tblRegistry.Value = '4' Then 'Scheduled' 
    When tblRegistry.Value = '5' Then 'Download and Custom' 
    Else tblRegistry.Value End As RegistryValue 
From tblAssets As TA Left Join tblRegistry On tblRegistry.AssetID = TA.AssetID 
Where tblRegistry.Valuename = 'AUoptions' And TA.AssetID = tblAssets.AssetID) 
As AUOption 
From tblAssets 
+0

다른 데이터가 필터링 된 이후로 중요하다고 생각하지 않았습니다. 분명히 모든 것이 테스트되고 있습니다. 이것은 나를 위해 일했다. 이제는 사람들에게 4가 무엇인지 말할 필요가 없습니다. 감사. – Matt

+0

어디서 필터링하는지 알 수 없습니다. 'where'가 있지만 테스트되는 열은'value'가 아닌'Valuename'입니다. 'valuename = 'AUoptions'' 일 때 데이터가'보장 '되어 숫자 값을 가질 수 있습니까? – B0Andrew

+0

의견을 읽고 그것에 대해 생각한 후 ... 아니, 나는 그것을 전혀 필터링하지 않을 것입니다. 연결된 valuename에서 값을 가져옵니다. 도움에 다시 한번 감사드립니다. 파란 달에 한 번만 SQL을 탐구하십시오. – Matt

관련 문제