2013-01-22 22 views
9

GIỮA CỦA MySQL bao gồm tất cả các kết quả giữa hai điểm cuối cũng như các điểm cuối.MySQL GIỮA không có điểm cuối

Nếu expr là lớn hơn hoặc bằng MIN và expr là nhỏ hơn hoặc bằng để max, GIỮA lợi nhuận 1, ngược lại trả về 0. Đây là tương đương để biểu thức (min < = expr VÀ expr < = max) nếu tất cả các đối số là cùng loại. REFERENCE- http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between

Có một chức năng như REALLYBETWEEN mà không bao gồm các thiết bị đầu cuối, hoặc tôi đang mắc kẹt sử dụng min < expr AND expr < max?

+2

Bạn đang mắc kẹt ... Và đó không phải là một điều xấu. nó ít nhất là rõ ràng. –

+2

'GIỮ min + 1 VÀ max - 1', nếu bạn đang làm việc với loại tích phân. – mellamokb

+0

@MichaelBerkowski. Cảm ơn. Đã tìm kiếm và không tìm thấy bất cứ điều gì nhưng không chắc chắn. Tin tốt là trước ngày hôm nay, tôi nghĩ BETWEEN không bao gồm các điểm cuối. Ít nhất là bây giờ tôi biết. – user1032531

Trả lời

11

Tôi nghĩ rằng bạn chỉ có thể viết nó cho mình như:

where val > start and val < end 

giữa là:

where val >= start and val <= end 

Đối với chỉ số, hai đầu tiên nên sử dụng một chỉ số một cách chính xác và giống hệt với between, giả định rằng bắt đầu và kết thúc là hằng số. Tôi không chắc chắn nếu phiên bản cuối cùng sẽ.

Nếu val là một biểu hiện phức tạp, sau đó xem xét như sau:

select * 
from (your query here) t 
where t.val > start and t.val < end 

này nên đánh giá val chỉ một lần. Tôi nghĩ rằng các hình thức khác sẽ đánh giá nó hai lần.

Hoặc, bạn có thể làm:

where val between start and end and val not in (start, end) 
+0

Đề xuất cuối cùng của bạn là cách sáng tạo cách sử dụng BETWEEEN mà không có điểm cuối! Đừng nghĩ rằng bất cứ ai nên sử dụng nó, nhưng nó chắc chắn trả lời câu hỏi. Tôi sẽ tiếp tục sử dụng hai giải pháp đầu tiên. – user1032531

1

Lưu ý rằng BETWEEN là một biểu hiện, không phải là một chức năng. Nó chỉ là một tiện ích mã hóa và có nghĩa là chính xác những gì được nói. Không có lợi ích hiệu suất.

Để loại trừ điểm cuối, bạn phải tự mã hóa điểm cuối.

+0

Tôi tự hỏi nếu điều này thực sự đúng. Có thể có một số cơ sở dữ liệu ở phía bên trái ('val') được đánh giá chỉ một lần cho' between' nhưng sẽ được đánh giá hai lần cho hai so sánh. –

+0

@GordonLinoff Tôi không thể nói nó là phổ quát, nhưng trên cơ sở dữ liệu tôi sử dụng, chạy một GIẢI THÍCH cho thấy 'một giữa x và y' được thực hiện như' a> = x và a <= y'. – BellevueBob

Các vấn đề liên quan