3

我正在尝试执行 SQL 语句

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

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

在数据类型 int 的列中转换 varchar 值“/home”时出现语法错误。

4

3 回答 3

4

由于DATA列是 varchar,因此您需要用单引号将值 ( 296 ) 括起来

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

您仍然可以不使用ISNUMERIC此处直接查询,并提高性能,因为您不必检查每条记录的数值。

我想,在你的情况下,使用IsNumeric是没有意义的。

SELECT * 
FROM   Menu
WHERE  Data = '296'
于 2012-11-23T09:41:42.330 回答
1

不幸的是,SQL 不保证短路评估,因此如果第一个条件为假,IsNumeric(Data)过滤器不会阻止评估第二个谓词, 。Data = 296

但是,您可以做的是将比较保留为 char 文字,例如

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

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

于 2012-11-23T09:41:25.563 回答
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 将返回1这些。这个问题将帮助您解决与此相关的问题...

于 2012-11-23T09:45:51.140 回答