J'ai besoin de vérifier que le résultat de l'expression dans l'endroit où la clause est dans la gamme d'entiers.
quelque chose lke ceci: p> avec Je veux dire qu'il doit être entier, ne pas flotter. Pour que je ne puisse pas utiliser (1 .. 8) code> représentant une gamme d'entiers. P> entre 1 et 8 code>, car 1.2 sera correct. p> p>
5 Réponses :
Vous pouvez le jeter de flotteur à int et utiliser entre code>. (Vous voudrez peut-être faire une colonne virtuelle / calculée en fonction de la performance de la requête.) P>
Pour tester COL1 / COL2 est un entier, vous pourriez les modeler ... P>
où (col1 / col2) = (col1 \ col2) et (col1 / col2) compris entre 1 et 8 P>
Ou tout aussi facilement, testez le modulo col1% col2 = 0
\ ne semble pas être un opérateur Oracle
@Patrick Vous avez raison. Oracle veut que vous utilisiez le plancher (x, y) et le mod (x, y). Le mien est la réponse inutile M $ SQL.
Comment sur
select * from table where (col1 / col2 ) BETWEEN 1 AND 8 and (col1 / col2 ) = FLOOR(col1 / col2 )
Le 1..8 n'est pas une syntaxe SQL valide pour une plage.
Cela a été copié de la question - ma contribution est correcte. Downvote la question à la place. J'ai mis à jour la clause où utiliser des oracles entre la fonction.
Vous pouvez bien sûr faire ceci:
select * from table where (col1 / col2 ) between 1 and 8 and mod (col1 , col2 ) = 0;
Pour autant que je vois la 2e variante est la meilleure option. Bien sûr dans (1, .., n) est la plus intuitive, mais moins pratique en cas de large gamme.
Vous pouvez utiliser la fonction de pipeline pour générer une gamme entières.
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)));