Sql 在具有不同数据类型的表中将数据类型varchar转换为数值时出错

Sql 在具有不同数据类型的表中将数据类型varchar转换为数值时出错,sql,sql-server,Sql,Sql Server,我想用between运算符从列中选择数据 看起来像这样: select count(distinct value) from dbo.OrganizationSupplementalData where value between 5 and 30; 但是 Error converting data type varchar to numeric 我也尝试过使用CAST,但不起作用: select count(distinct value) from dbo.Organizat

我想用
between
运算符从列中选择数据 看起来像这样:

select count(distinct value) 
  from dbo.OrganizationSupplementalData
 where value between 5 and 30;
但是

Error converting data type varchar to numeric
我也尝试过使用CAST,但不起作用:

select count(distinct value) 
  from dbo.OrganizationSupplementalData
 where cast(value as decimal(22, 8)) between 0.1 and 30.00;
value
列中驻留以下类型的数据:

2017
2017
2017
2017
8:55:00 AM
11:00:00 AM
8:00:00 AM
8:45:00 AM
3.66
2.35
如何最终提取所需的数据? 谢谢

使用
试试CAST()

显然,当您尝试将非数字值转换为数字时,这些非数字值会导致问题<在这种情况下,code>TRY\u CAST()将返回
NULL

在SQL Server的较旧、不受支持的版本中,可以使用
大小写
表达式:

where (case when value not like '%[0-9.]%' and
                 value not like '%.%.%'
            then CAST(value AS DECIMAL(22, 8))
       end)

哇,非常好的功能,甚至14版都支持。戈登·林诺夫,上帝保佑你,伙计!非常感谢你。我不明白为什么它不能转换它。现在了解错误,以及将来如何处理。确实谢谢你。@AlexanderTunick补充说,在同一列中有不同的数据类型可能表明数据模型有缺陷。解决根本原因可以避免使用
TRY\u CAST
或其他解决方法。@DanGuzman完全正确!我不得不同意你!但有一个不是,我们使用客户的数据库,它是完整的。我们给他们的建议正在进行中,他们已经解决了这个问题,但是这个过程非常慢。为什么要将时间、整数值和小数值存储在一个列中(这些类型都不是)。这里真正的问题是你的数据和设计。
where (case when value not like '%[0-9.]%' and
                 value not like '%.%.%'
            then CAST(value AS DECIMAL(22, 8))
       end)