我正在尝试执行SQL语句
SELECT *
FROM Menu
WHERE ISNumeric(Data) = 1
AND Data = 296
其中Data
字段可能包含数字或非数字内容。
但我收到类似
在数据类型int。
列中转换varchar-value'/ home'时出现语法错误
答案 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将为这些返回1
。 This question将帮助您解决有关该问题的问题......