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
)
我在 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
)