Какой хороший способ фильтрации данных по значениям, которые соответствуют праву десятичного разряда? - PullRequest
2 голосов
/ 26 августа 2010

Допустим, у меня есть следующие данные в столбце идентификаторов decimal (18,9) в таблице базы данных:

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

Я хочу написать запрос SQL, который возвращает только те записи, которые имеют .230000000 длясправа от десятичной точки, так что возвращаются только следующие данные:

1001.23
1003.23

Я знаю, что мог бы сделать это, преобразовав его в строку, выполнив сравнение строк, но есть ли лучший способ, который нене требует сравнения строк и более эффективен при обработке числовых значений?


На основании Ответ Мартина , я думаю, что лучшее решение для использования будет выглядеть так:*

Я добавил функцию 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 ]

2 голосов
/ 26 августа 2010

Можете ли вы создать постоянный вычисляемый столбец

id - cast(id as int)

Так что вы можете затем индексировать его?

2 голосов
/ 26 августа 2010
SELECT
    [ID]
FROM
    [TABLE]
WHERE
    [ID] - ROUND([ID], 0) = .23
0 голосов
/ 26 августа 2010

Как насчет этого?

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