2010-09-19 12 views
5

Próbuję użyć MIĘDZY z nazwami kolumn zamiast wartości bezpośrednich, coś takiego:Wybierz pomiędzy kolumną wartości

SELECT * FROM table WHERE column1 BETWEEN column2 AND column3; 

To jest coś jak powrót 17 wierszy, ale jeśli mogę napisać:

SELECT * FROM table WHERE (column1 <= column2 AND column1 >= column3) OR (column1 >= column2 AND column1 <= column3) 

Dostaję około 600 wierszy .. W obu przypadkach otrzymuję tylko wiersze, w których wartość kolumny1 jest rzeczywiście wartością środkową, ale druga metoda daje mi znacznie więcej wyników, więc pierwsza metoda ma z nią coś nie w porządku.

Podejrzeń, że problem może być przy użyciu klauzula BETWEEN z nazwami kolumn, zamiast czystych wartości, i jakoś SQL konwertuje nazwy kolumn do rzeczywistych wartości .. to dziwne, ale czy ktoś może mnie oświecić proszę? Dzięki

+2

Czytając moje pytanie 2 lat ostatnich. ..Nie mogę nawet zrozumieć, jak oczekiwałem, że zapytanie zadziała ... –

Odpowiedz

10
SELECT * FROM table WHERE column1 BETWEEN column2 AND column3; # gives 17 rows 

jest taka sama jak

SELECT * FROM table WHERE (column1 >= column2 AND column1 <= column3) # gives 17 rows 

powodu czeku addycji

(column1 <= column2 AND column1 >= column3) 

która OR ed, otrzymasz dodatkowe wiersze.

+0

Ha. Ok, więc dodanie dodatkowej kolumny1 BETWEEN kolumna3 I kolumna2 rozwiązałoby ją również. Oznacza to, że pierwsza wartość w klauzuli BETWEEN jest w rzeczywistości wartością minimalną, a drugą maksymalną. Dzięki za pomoc –

+0

Zgadnij, że nie widzisz mojego komentarza na temat drugiej odpowiedzi. – vol7ron

0

logiki dla dwóch stwierdzeń nie jest taka sama:

SELECT * FROM table WHERE (column1 <= column2 AND column1 >= column3) OR (column1 >= column2 AND column1 <= column3) 

Ma dwie klauzule. Usuń pierwszą i powinieneś mieć takie same wyniki, jak instrukcja między.

SELECT * FROM table WHERE (column1 >= column2 AND column1 <= column3) 
0
(column1 <= column2 AND column1 >= column3) 

te dwa warunki tylko wydajność TRUE jeśli trzy wartości są uporządkowane w sposób następujący:

column3 <= column1 <= column2 

Oznacza to, że warunek odpowiada:

column1 BETWEEN column3 AND column2 

Podobnie

(column1 >= column2 AND column1 <= column3) 

Oznacza to Kolejność:

column2 <= column1 <= column3 

Oznacza to, że warunek ten jest równoważny do pierwszego WHERE klauzuli, tj .:

column1 BETWEEN column2 AND column3 

W obu przypadkach column1 jest środkową wartością wszystkich wyników zapytania, jak już zauważyłeś.

A dwie kwerendy zrobić dawać różne wyniki, ponieważ pierwszy ma WHERE klauzuli:

column1 BETWEEN column2 AND column3 

natomiast drugie zapytanie skutecznie ma WHERE klauzuli:

(column1 BETWEEN column2 AND column3) OR (column1 BETWEEN column3 AND column2) 

(co oznacza, że kolejność dwóch właściwych operandów operatora BETWEEN .. AND .. jest rzeczywiście ważna.)

2

Between A And B zakłada, że ​​A<B, tj. Że pierwsze wyrażenie w polu Pomiędzy (A) jest mniejsze niż drugie wyrażenie, (B), nie sprawdza ani nie wykonuje z przeciwną opcją.

przykład jeśli umieścisz Where 3 Between 4 And 2nie wierszy zostaną zwrócone:

lub, jeśli piszesz

Select Case When 3 Between 4 and 2 then 'true' else 'false' end

powróci false

Powiązane problemy