在Varchar列上使用IsNumeric的SQL语法错误

时间:2012-11-23 09:39:02

标签: sql sql-server

我正在尝试执行SQL语句

SELECT * 
FROM Menu
WHERE ISNumeric(Data) = 1
AND Data = 296

其中Data字段可能包含数字或非数字内容。 但我收到类似

的语法错误
  

在数据类型int。

列中转换varchar-value'/ home'时出现语法错误

3 个答案:

答案 0 :(得分:4)

由于DATA列是varchar,您需要用单引号括起值( 296

SELECT * 
FROM   Menu
WHERE  ISNumeric(Data) = 1 AND Data = '296'

你仍然可以在这里不使用ISNUMERIC直接查询,并且因为你没有提高性能;必须检查每个记录的数值。

在您的情况下,使用IsNumeric毫无意义,我猜

SELECT * 
FROM   Menu
WHERE  Data = '296'

答案 1 :(得分:1)

不幸的是,SQL没有guarantee short circuit evaluation,因此如果第一个条件为false,IsNumeric(Data)过滤器将不会阻止对第二个谓词Data = 296的评估。

然而,您可以将比较保留为字面值,例如

SELECT * 
FROM Menu
WHERE ISNumeric(Data) = 1
AND Data = '296';

出于兴趣,如果您要与精确的数值进行比较,为什么还需要进行IsNumeric检查?

答案 2 :(得分:0)

为了添加@StuartLC的答案,一个解决方法是使用子查询首先获取所有数值,例如:

SELECT *
FROM   (
    SELECT CAST(Data AS int) AS Data, 
           -- Other fields
    FROM   Menu
    WHERE  ISNumeric(Data) = 1
) subquery
WHERE subquery.Data = 296

虽然请注意,您需要确保不会有十进制数字,科学记数法或类似的东西,因为IsNumeric将为这些返回1This question将帮助您解决有关该问题的问题......