我正在处理此查询,它返回异常无法将 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# 代码生成的。其中子句过滤器可以是数字或字符串,因为用户选择他/她想要的过滤器类型并根据给出其值。
有没有一种方法可以让我在查询中添加任何类型的过滤器?
最佳答案
如果您唯一的列类型是 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 表达式结果类型
,即 int => 失败。
关于sql - 在 SQL Server 中将列值转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479335/