9
votes

Y a-t-il des gammes entière pour où la clause?

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: xxx

avec (1 .. 8) représentant une gamme d'entiers.

Je veux dire qu'il doit être entier, ne pas flotter. Pour que je ne puisse pas utiliser entre 1 et 8 , car 1.2 sera correct.


0 commentaires

5 Réponses :


0
votes

Vous pouvez le jeter de flotteur à int et utiliser entre . (Vous voudrez peut-être faire une colonne virtuelle / calculée en fonction de la performance de la requête.)


0 commentaires

0
votes

Pour tester COL1 / COL2 est un entier, vous pourriez les modeler ...

où (col1 / col2) = (col1 \ col2) et (col1 / col2) compris entre 1 et 8


3 commentaires

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.



1
votes

Comment sur

select * 
from table
where (col1 / col2 ) BETWEEN 1 AND 8
  and (col1 / col2 ) = FLOOR(col1 / col2 )


2 commentaires

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.



10
votes

Vous pouvez bien sûr faire ceci:

select * from table where (col1 / col2 ) between 1 and 8
and mod (col1 , col2 ) = 0;


1 commentaires

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.



0
votes

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)));


0 commentaires