Мне нужно проверить, что результат выражения в предложении где находится в диапазоне целых чисел.
что-то вроде этого:
select * from table where (col1 / col2 ) in (1..8).
С (1..8), представляющим диапазон целых чисел.
(1..8)
Я имею в виду, что это должно быть целое число, а не число с плавающей точкой. Так что я не могу использовать between 1 and 8, потому что 1.2 будет правильным.
between 1 and 8
Конечно, вы можете сделать это:
select * from table where (col1 / col2 ) in (1,2,3,4,5,6,7,8);
или
select * from table where (col1 / col2 ) between 1 and 8 and mod (col1 , col2 ) = 0;
Как насчет
select * from table where (col1 / col2 ) BETWEEN 1 AND 8 and (col1 / col2 ) = FLOOR(col1 / col2 )
Это просто проверяет, находится ли дробь в интервале, и целое.
Вы можете использовать функцию конвейера для генерации целочисленного диапазона.
create or replace type my_number_collection is table of number; create or replace function gen_range (p_from in number, p_to in number) return my_number_collection PIPELINED as begin for i in p_from..p_to loop pipe row(i); end loop; return; end; / select * from my_table where col1/col2 in (select column_value from table(gen_range(1,8)));
Чтобы проверить, что col1 / col2 - это целое число, вы можете изменить их вместе ...
Где (col1 / col2) = (col1 \ col2) и (col1 / col2) от 1 до 8
Вы можете разыграть его из числа с плавающей точкой в int и использовать between. (Возможно, вы захотите создать виртуальный / вычисляемый столбец в зависимости от производительности запроса.)
between