我正在处理此查询并且返回异常无法将varchar
转换为int
:
SELECT BG_PRIORITY, count(*) as cnt
FROM Bug
WHERE BG_TARGET_REL= case when ISNUMERIC('XXXX 13.5') = 1 then
cast('XXXX 13.5' as int) else 'XXXX 13.5' end
GROUP BY BG_PRIORITY
此查询是从我的C#代码生成的。 Where子句过滤器可以是数字或字符串过滤器,因为用户选择他/她想要的过滤器类型并根据其值给出。
是否有方法可以在查询中添加任何类型的过滤器?
答案 0 :(得分:4)
IF 您的唯一列类型是int
和varchar
,那么您只需使用它:
SELECT BG_PRIORITY, count(*) as cnt
FROM Bug
WHERE <ChosenColumn> = 'InputValue'
GROUP BY BG_PRIORITY;
这可以通过使用SQL Server的隐式data type precedence转换来实现。如果是int,则输入值(如'123'
)将转换为数字123(正是我们想要的那样!)。如果列是varchar,则引用的值仍为varchar。
您的原始CAST错误源于CASE语句导致一种数据类型和一种数据类型,使用上面链接的相同数据类型优先级规则。考虑你的分支机构:
case when ISNUMERIC('XXXX 13.5') = 1
then cast('XXXX 13.5' as int) --<< this branch returns int
else 'XXXX 13.5' --<< this branch returns varchar
end
>> data type precedence ==> resultant type of expression is "int"
当你给它一个值'XXXX 13.5'时,case语句会产生'XXXX 13.5',然后它需要转换为CASE expression resultant type
,即int =&gt;失败。