2009-07-16 27 views
7

Tôi cần kiểm tra kết quả biểu thức trong mệnh đề where nằm trong phạm vi của Số nguyên.Có dải số nguyên cho Trường hợp khoản không?

một cái gì đó lke này: chọn * từ bảng nơi (col1/col2) trong (1..8). (1..8) - nghĩa là dãy số nguyên.

Tôi có nghĩa là nó phải là số nguyên chứ không phải là phao. Vì vậy mà tôi không thể sử dụng "giữa 1 và 8", bởi vì 1,2 sẽ là chính xác.

Có suy nghĩ nào không?

Trả lời

9

Bạn có thể dĩ nhiên làm điều này:

select * from table where (col1/col2) in (1,2,3,4,5,6,7,8); 

hoặc

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

Theo như tôi thấy biến thể thứ 2 là lựa chọn tốt nhất. Tất nhiên trong (1, .., n) là trực quan nhất, nhưng ít tiện dụng trong trường hợp phạm vi rộng. – zmische

0

Bạn có thể truyền từ phao sang int và sử dụng between. (Bạn có thể muốn thực hiện một virutal/cột tính tùy thuộc vào hiệu suất của truy vấn.)

+0

Nếu bạn truyền từ phẩy sang số nguyên, nó sẽ luôn vượt qua kiểm tra số nguyên ... –

+0

Ah, điểm tốt! Tôi cần cà phê của tôi. =) – Nelson

0

Để kiểm tra col1/col2 được một số nguyên, bạn có thể Mod chúng lại với nhau ...

đâu (col1/col2) = (col1 \ col2) và (col1/col2) từ 1 đến 8

+0

Hoặc dễ dàng, kiểm tra modulo col1% col2 = 0 – Bill

+0

\ dường như không phải là nhà điều hành Oracle –

+0

@patrick bạn nói đúng. Oracle muốn bạn sử dụng Floor (x, y) và Mod (x, y). Mỏ là câu trả lời M $ SQL vô dụng. – Bill

1

Làm thế nào về

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

này chỉ đơn giản là kiểm tra nếu phần là trong khoảng thời gian, số nguyên.

+0

Điều này không hoạt động trên oracle ... – FerranB

+0

Phần nào của nó? –

+0

Cú pháp SQL 1..8 không hợp lệ cho một phạm vi. –

0

Bạn có thể sử dụng chức năng đường ống để tạo ra dãy số nguyên.

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))); 
Các vấn đề liên quan