2013-01-22 16 views
9

MySQL's BETWEEN zawiera wszystkie wyniki między dwoma punktami końcowymi: , a także punkty końcowe.MySQL MIĘDZY bez punktów końcowych

Jeśli wyrażenie jest większe niż lub równe min i wyrażenie jest mniejsza niż lub równa max pomiędzy zwraca 1, w innym przypadku zwraca 0. Jest to równoważne wyrażeniu (minimum < = wyrażenie I wyrażenie < = max), jeśli wszystkie argumenty są tego samego typu. REFERENCE- http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between

Czy istnieje funkcja jak REALLYBETWEEN która nie obejmuje punkty końcowe, albo ja zatrzymany przy użyciu min < expr AND expr < max?

+2

Utknąłeś ... A to nie jest takie złe. jest co najmniej jednoznaczne. –

+2

'BETWEEN min + 1 AND max - 1', jeśli pracujesz z typem całkowitym. – mellamokb

+0

@ Michael Christianer. Dzięki. Szukałem i nie znalazłem niczego, ale nie było pewne. Dobra wiadomość była do dzisiaj, myślałem, że BETWEEN nie zawiera punktów końcowych. Przynajmniej teraz wiem. – user1032531

Odpowiedz

11

myślę, że można po prostu napisać go samodzielnie jako:

where val > start and val < end 

Between:

where val >= start and val <= end 

chodzi o indeksy, dwie pierwsze należy użyć indeksu prawidłowo i identycznie between, przy założeniu, że początek i koniec są stałymi. Nie jestem pewien, czy ostatnia wersja będzie.

Jeśli val jest skomplikowane wyrażenie, a następnie rozważyć następujące kwestie:

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

ten powinien oceniać val tylko raz. Sądzę, że inne formy oceniałyby to dwukrotnie.

Albo można zrobić:

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

Twoja ostatnia sugestia to twórczy sposób używania BETWEEEN bez punktów końcowych! Nie sądzę, że ktokolwiek powinien z niego korzystać, ale zdecydowanie odpowiedział na to pytanie. Nadal będę korzystał z dwóch pierwszych rozwiązań. – user1032531

1

Zauważ, że BETWEEN jest wyrazem, a nie funkcja. To tylko wygoda kodowania i oznacza dokładnie to, co mówi. Nie ma korzyści z wydajności.

Aby wykluczyć punkty końcowe, należy je zakodować samodzielnie.

+0

Zastanawiam się, czy to naprawdę prawda. Mogą istnieć pewne bazy danych, w których lewa strona ("val") jest oceniana tylko raz dla "między", ale byłaby oceniana dwukrotnie dla dwóch porównań. –

+0

@GordonLinoff Nie mogę powiedzieć, że jest uniwersalny, ale w bazach danych, których używam, uruchomienie EXPLAIN ujawnia, że ​​'a pomiędzy x i y' jest wykonywane jako' a> = x i a <= y'. – BellevueBob

Powiązane problemy