2015-06-24 57 views
0

在SQL Server 2008 R2上編寫Sql命令時出現問題。
事實是,我有數字和nvarchar數據存儲在同一列(IMP_VALUE)。 當我嘗試執行此命令SQL Server - SQL由於多數據類型而選擇問題子句

Select count(*) 
from IMPORTBM 
    inner join ATTRIBUTE on ATT_ATTRIBUTE_ID = IMP_ATTRIBUTE_ID 
where IMP_LOCATION_ID = 1 
    AND IMP_SERIAL_ID = 58 
    AND IMP_VERSION_ID = 1 
    AND 
     ((ATT_ATTRIBUTE = 'GBHT' AND IMP_VALUE = 'NA') 
     OR (ATT_ATTRIBUTE = 'GBLOPK' AND IMP_VALUE = 'NA') 
     OR (ATT_ATTRIBUTE = 'BRGLWLNG' AND IMP_VALUE = 0.603) 
     OR (ATT_ATTRIBUTE = 'MSZ' AND IMP_VALUE IN ('LMV-321','LMV-322')) 
     OR (ATT_ATTRIBUTE = 'GBACCK' AND IMP_VALUE IN ('NA','WARNING_NoValueFound')) 
     OR (ATT_ATTRIBUTE = 'GBTHLWLOC' AND IMP_VALUE IN ('NA','WARNING_NoValueFound'))) 

,它失敗,出現錯誤:

消息8114,級別16,狀態5,行1
錯誤的數據類型爲varchar轉換爲數字。

當然,我爲了使這項工作

CAST(IMP_VALUE as numeric) = 0.603 

改變這一點,但事實並非如此。

當我只執行命令的第一部分,一切工作正常

Select count(*) 
from IMPORTBM 
    inner join ATTRIBUTE on ATT_ATTRIBUTE_ID = IMP_ATTRIBUTE_ID 
where IMP_LOCATION_ID = 1 
    AND IMP_SERIAL_ID = 58 
    AND IMP_VERSION_ID = 1 
    AND 
     ((ATT_ATTRIBUTE = 'GBHT' AND IMP_VALUE = 'NA') 
     OR (ATT_ATTRIBUTE = 'GBLOPK' AND IMP_VALUE = 'NA') 
     OR (ATT_ATTRIBUTE = 'BRGLWLNG' AND CAST(IMP_VALUE as numeric) = 0.603)) 

但是,當我加入where最後3行:

 OR (ATT_ATTRIBUTE = 'MSZ' AND IMP_VALUE IN ('LMV-321','LMV-322')) 
     OR (ATT_ATTRIBUTE = 'GBACCK' AND IMP_VALUE IN ('NA','WARNING_NoValueFound')) 
     OR (ATT_ATTRIBUTE = 'GBTHLWLOC' AND IMP_VALUE IN ('NA','WARNING_NoValueFound'))) 

,它無法與同錯誤代碼比以前!
有人知道爲什麼它只能在沒有in行的情況下工作嗎?
另外,你有什麼可以使這項工作?
非常感謝!

+1

如果你的領域是VARCHAR,那麼你爲什麼不這樣做'AND IMP_VALUE =「0.603''?這可以避免查詢在與'0.603'比較之前嘗試將其中的'NA'行轉換爲NUMERIC ... – MatBailie

+0

因爲我可以使用多個運算符(例如>,< > =,<=,in,不在,之間),而這個where子句是動態的,它根據我的用戶需要創建數字和varchar值。 (我不確定是否清楚,我的英語很差...) – KrasshX

+0

然後你依靠短路;當ATT_ATTRIBUTE ='BRGLWLNG''條件失敗時,優化器知道不應用'CAST(IMP_VALUE AS NUMERIC)'。由於WHERE子句的複雜性導致短路失敗,或者即使在ATT_ATTRIBUTE ='BRGLWLNG'時,IMP_VALUE中的值也不是數值。 – MatBailie

回答

0

嘗試運行此查詢,看看雙方的值實際數值...

SELECT MIN(IMP_VALUE), MAX(IMP_VALUE) FROM ATTRIBUTE WHERE ATT_ATTRIBUTE = 'BRGLWLNG'; 

我敢肯定你在裏面有價值觀,不能轉化爲NUMERIC

您的OR需要將其過濾掉,或者您需要修正這些值,以便它們的格式正確的字符串表示形式爲NUMERIC


另外請注意,你只是用NUMERIC,和SQL Server的幫助頁說,這只是一樣NUMERIC(18,0); 18位數字,小數點後無數字。嘗試更合適的數據類型(以下是蠻力選項) ...

OR ( ATT_ATTRIBUTE      = 'BRGLWLNG' 
    AND ISNUMERIC(IMP_VALUE)    = 1 
    AND CAST(IMP_VALUE AS NUMERIC(38,19)) = 0.603 
) 
+0

第一個查詢返回:1.400 \t 1.400 – KrasshX

+0

你問我做的第二件事情完美無缺!!謝謝!!但是爲什麼當我嘗試使用float數據類型時,這工作不正常? – KrasshX

+0

@KrasshX - 那是不是工作?錯誤的結果,錯誤信息? – MatBailie