在sql查询中使用十进制

ipakzgxi  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(307)

我有一个专栏 Amount 在我的sql server数据库中定义为 varchar(20), null .
它的价值观如下:

1.56867
2.0
2.0000
2

如果客户端应用程序中的用户输入2进行搜索,那么我需要从数据库中提取除值1.56867以外的所有记录。
因此,搜索结果应产生:

2.0
2.0000
2

我尝试在sql查询中使用它,但它仍然返回值1.56867。

CONVERT(decimal, myTable.Amout) = CONVERT(decimal, 2)

你能给个建议吗?
谢谢。

093gszye

093gszye1#

您应该考虑修复数据模型,将数字存储为数字而不是字符串。
也就是说,您需要为 decimal ,否则默认为 decimal(38, 0) ,这将导致小数部分被截断。比如:

convert(decimal(20, 5), myTable.Amout) = 2

这将为您提供最多20位数字,包括5位十进制数字。这里不需要显式地转换正确的操作数(这已经是一个文字数字了)。
如果列可能包含不能转换为数字的值,则可以使用 try_convert() 而不是 convert() 以避免错误。

1l5u6lss

1l5u6lss2#

问题是在转换字符串时 '1.56867'decimal ,sql server假定需要0位小数(正如@gmb所指出的),并将值舍入到最接近的整数(2)。

select convert(decimal,'1.56867');

-------
2

另外,由于列被定义为保存字符数据,因此应该使用 try_cast() 要避免的功能 Error converting data type varchar to numeric. 如果列中存在非数字数据,则会发生错误。

select *
from (values
     ('1.56867')
    ,('2.0')
    ,('2.0000')
    ,('2')
    ,(null)
    ,('non-numeric value')
     ) myTable(Amount)
where try_cast(Amount as decimal(38,19)) = 2
;

Amount
-----------------
2.0
2.0000
2

(3 rows affected)

相关问题