SQL 服务器 - SQL Select 问题,因为多数据类型 where 子句

SQL Server - SQL Select issue because of multi datatype where clause

我在 SQL Server 2008 R2 上编写 Sql 命令时遇到问题。
事实上,我将数字和 nvarchar 数据存储在同一列 (IMP_VALUE) 中。 当我尝试执行此命令时

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')))   

,失败并显示错误:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

当然,我已经更改了它以使其工作

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 行的情况下工作吗?
另外,你有什么东西可以使它起作用吗?
非常感谢!

尝试运行这个查询,看看两个值是否都是实数值...

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

我很确定您的值无法转换为 NUMERIC

您的 OR 需要将它们过滤掉,或者您需要修复这些值,以便它们是 NUMERIC.

的格式正确的字符串表示形式


此外,请注意您只是在使用 NUMERIC,sql 服务器帮助页面说这与 NUMERIC(18,0) 相同; 18位数字,小数点后无数字。尝试更合适的数据类型(以下为暴力破解选项)...

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