检查字段

时间:2016-09-22 11:13:27

标签: sql sql-server

我正在开发一个数据库,其中一些明亮的火花决定在char字段中存储数字和字母(没有充分理由)是一个好主意。

现在我需要选择数字低于某个值的位置,但由于某些记录中存在字母,显然会出现错误。

我试过以下

select column1
from table1
where ISNUMERIC(column1)=1
AND column1<=16

然而我收到以下错误

  

转换varchar值时转换失败&#39; 5.00&#39;数据   输入int。

现在看起来像是一个数字,所以为什么不能转换呢?

2 个答案:

答案 0 :(得分:1)

这是SQL Server中的已知问题。 SQL Server 2012+中的正确​​解决方案是使用try_convert()

select column1
from table1
where try_convert(int, column1) <= 16;

您的查询的问题是SQL Server(与所有其他数据库一样)不保证where子句中表达式的评估顺序。请注意,您无法使用子查询或CTE修复您的版本,因为SQL Server保留在编译和执行查询时重新排列操作的权限。

在早期版本中,您基本上可以使用case

执行相同的操作
select colum1
from table1
where (case when isnumeric(column1) = 0
            then 999
            else convert(int, column1)
       end) <= 16

注意:这两个都假设字符串值是一个整数。如果它可以是十进制数,则使用适当的类型进行转换。

答案 1 :(得分:1)

CAST列,如果它是NUMERIC

select column1
from table1
where ISNUMERIC(column1)=1
AND CAST(column1 AS DECIMAL(18,2)) <= 16.0