根据与小数点右侧匹配的值过滤数据的好方法是什么?

时间:2010-08-26 18:15:35

标签: sql sql-server numbers filtering

假设我在数据库表的decimal (18,9)标识列中有以下数据:

ID
========
1000.00
1001.23
1002.00
1003.23

我想编写一个SQL查询,它只返回小数点右侧有.230000000的记录,这样只返回以下内容:

1001.23
1003.23

我知道我可以通过将它转换为字符串来进行字符串比较来实现这一点,但有没有更好的方法不涉及字符串比较并且在处理数值方面更有效?


基于Martin's answer,我认为使用的最佳解决方案是这样的:

Abs(ID - Cast(ID As int))

我添加了Abs()函数来处理负数。

我运行了以下测试,以确保我没有得到奇怪的舍入错误:

Declare @ID decimal(18,9)

Set @ID = 1000.000000000
Select @ID, Abs(@ID - Cast(@ID As int))
-- Returns: 1000.000000000  0.000000000

Set @ID = -1000.000000000
Select @ID, Abs(@ID - Cast(@ID As int))
-- Returns: -1000.000000000 0.000000000

Set @ID = 1000.000000001
Select @ID, Abs(@ID - Cast(@ID As int))
-- Returns: 1000.000000001  0.000000001

Set @ID = -1000.000000001
Select @ID, Abs(@ID - Cast(@ID As int))
-- Returns: -1000.000000001 0.000000001

Set @ID = 1000.999999999
Select @ID, Abs(@ID - Cast(@ID As int))
-- Returns: 1000.999999999  0.999999999

Set @ID = -1000.999999999
Select @ID, Abs(@ID - Cast(@ID As int))
-- Returns: -1000.999999999 0.999999999

3 个答案:

答案 0 :(得分:2)

SELECT
    [ID]
FROM
    [TABLE]
WHERE
    [ID] - ROUND([ID], 0) = .23

答案 1 :(得分:2)

您可以创建一个持久计算列

id - cast(id as int)

那么你可以将它编入索引吗?

答案 2 :(得分:0)

这个怎么样?

SELECT MyCol
FROM MyTable
WHERE MyCol - ROUND(MyCol, 0) = .23