我有一个名为testTable
的表,其中有两列,id
,自动递增,someValue
。
someValue
列中包含的数据为:12, 1.2, .4, 1d4, +, -, .
someValue
的数据类型为varchar(50)
。
为什么以下查询会抛出
将数据类型varchar转换为数字时出错。
select ID, someValue
from testTable
where ISNUMERIC(someValue + 'd0') = 1 and CAST(someValue as decimal(8,2)) > 0.1;
select tt.ID,tt.someValue
from (select ID, someValue
from testTable
where ISNUMERIC(someValue + 'd0') = 1) as tt
where CAST(tt.someValue as decimal(8,2)) > 0.1;
答案 0 :(得分:1)
你有一些问题; CAST
不适用于非十进制输入,ISNUMERIC
接受可转换为金额的字符串,包括非小数值,如“ - ”,“。”或“US $ 100”。< / p>
解决此问题的正确方法是向数据库中添加Decimal
列,填充someValue
以填充Decimal
列,并使用您要比较的值,以及仅与Decimal
列进行比较。
如果由于某种原因,您无法执行此操作,则可以使用ISNUMERIC
并仅包含非货币小数,并使用Convert
代替CAST
:
select ID, someValue
from testTable
where ID IN
(select ID from testTable where ISNUMERIC(someValue) = 1
AND Patindex('%[^0-9-+.]%', someValue) = 0
AND someValue NOT IN ('-', '+', '.')
)
and Convert(decimal, someValue) > 0.1
答案 1 :(得分:0)
在您的第一个声明中,您直接从testTable
开始尝试:
CAST(someValue as decimal(8,2))
由于您没有过滤掉非数值,因此会抛出错误。