Выбор десятичных значений с масштабом> X - PullRequest
1 голос
/ 30 октября 2019

Учитывая столбец, определенный как NUMBER(18,5), выберите все значения, которые имеют более X явных десятичных разрядов, например ::

1.00001
1.00012
1.00123
1.01234
1.12345
1.12340 (1.1234)
1.12300 (1.123)
1.12000 (1.12)
1.10000 (1.1)

Когда X = 4, у нас будет:

1.00001
1.00012
1.00123
1.01234
1.12345

Ответы [ 4 ]

2 голосов
/ 30 октября 2019

Типичным решением является увеличение числа до целевого значения 10, а затем проверка наличия десятичного напоминания.

Таким образом, условие будет выглядеть следующим образом:

trunc(:mynumber * power(10, :myscale)) <> :mynumber * power(10, :myscale)

Демонстрация на DB Fiddle :

with mynumbers as (
    select 1.00001 num from dual
    union all select 1.00012 from dual
    union all select 1.00123 from dual
    union all select 1.01234 from dual
    union all select 1.12345 from dual
    union all select 1.12340 from dual
    union all select 1.12300 from dual
    union all select 1.12000 from dual
    union all select 1.10000 from dual
),
    myscale as (select 4 sca from dual)
select *
from mynumbers n
inner join myscale s
    on trunc(n.num * power(10, s.sca)) <> n.num * power(10, s.sca)
    NUM | SCA
------: | --:
1.00001 |   4
1.00012 |   4
1.00123 |   4
1.01234 |   4
1.12345 |   4
1 голос
/ 30 октября 2019

Немного проще, чем ответ GMB, за который я проголосовал и который хорош, - просто сравнить число с trunc() числа с желаемой точностью.

Например, если вы хотите всес точностью не менее 4 знаков после запятой,

WHERE num != trunc(num,4-1);

Возьмите число, подобное 0,1234. trunc(0.1234,4-1) равно 0,123, что отличается от числа и раздачи, что число имеет не менее 4 десятичных знаков.

1 голос
/ 30 октября 2019

Это вариант ответа GMB (который мне нравится, поэтому я также проголосовал). Вы можете проверить десятичный компонент, используя mod():

mod(n.num * power(10, s.sca), 1) <> 0

Аргумент 1 принимает компонент дроби.

0 голосов
/ 30 октября 2019

При использовании SQL Server это должно работать:

ГДЕ LEN (CONVERT (DOUBLE PRECISION, [your_column])) - - LEN (CONVERT (INT, [your_column])) + 1)> 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...