sql - 在 SQL Server 中将列值转换为 int

标签 sql sql-server casting

我正在处理此查询,它返回异常无法将 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# 代码生成的。其中子句过滤器可以是数字或字符串,因为用户选择他/她想要的过滤器类型并根据给出其值。

有没有一种方法可以让我在查询中添加任何类型的过滤器?

最佳答案

如果您唯一的列类型是 intvarchar,那么您可以简单地使用:

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/

相关文章:

SQL Server - 在Where和Select中使用Exists子句

sql-server - 如何保留 SQL Server 存储过程修订历史记录

c++ - 什么时候需要显式指针类型转换?

java - com.microsoft.sqlserver.jdbc.SQLServerException : Connection timed out (Read failed)

Mysql对Select查询结果进行select查询

sql - 外键引用另一个模式中的表

SQL Server 2008 区分大小写的唯一列

c - 显式转换问题,C

c - 如果转换传递给 sscanf 的参数会发生什么

sql - 如何删除基于两列的重复行? (例如一对值集)