2010-09-19 3 views
5

Я пытаюсь использовать BETWEEN с именами столбцов вместо прямых значений, что-то вроде этого:Выбор между значениями столбца

SELECT * FROM table WHERE column1 BETWEEN column2 AND column3; 

Это возвращает что-то вроде 17 строк, но если я пишу:

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

Я получаю около 600 строк .. В обоих случаях я получаю только строки, где значение столбца на самом деле является средним значением, но второй метод дает мне гораздо больше результатов, поэтому у 1-го метода есть что-то не так.

Я подозреваю, что проблема может заключаться в использовании предложения BETWEEN с именами столбцов вместо чистых значений, и каким-то образом SQL преобразует имена столбцов в фактические значения .. странно, но может кто-нибудь просветить меня, пожалуйста? Благодаря

+2

Чтения моего вопроса 2 года последним. .. Даже не могу понять, как я ожидал, что запрос будет работать ... –

ответ

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

такой же, как

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

Из-за вашей капельной проверки

(column1 <= column2 AND column1 >= column3) 

которая OR ред, вы получите дополнительные строки.

+0

Ha. Хорошо, поэтому добавление дополнительной колонки1 BETWEEN column3 И column2 также решит ее. Значение первого значения в предложении BETWEEN на самом деле является минимальным значением, а второе - максимальным. Спасибо за помощь –

+0

Я думаю, вы не видели моего комментария к другому ответу. – vol7ron

0

Ваша логика для двух утверждений не то же самое:

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

Имеет два положения. Удалите первое, и вы должны иметь те же результаты, что и ваш оператор.

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

Эти два условия только выход TRUE, если три значения упорядочены следующим образом:

column3 <= column1 <= column2 

То есть, условие эквивалентно:

column1 BETWEEN column3 AND column2 

Аналогично,

(column1 >= column2 AND column1 <= column3) 

подразумевает этот порядок:

column2 <= column1 <= column3 

Это условие эквивалентно первого WHERE пункта, т.е. .:

column1 BETWEEN column2 AND column3 

В обоих случаях column1 является средним значением для всех результатов запроса, как вы уже заметили.

И два запроса делают дают различные результаты, потому что первый имеет WHERE раздел:

column1 BETWEEN column2 AND column3 

в то время как второй запрос эффективно имеет WHERE раздел:

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

(что означает, что порядок двух правильных операндов оператора BETWEEN .. AND .. действительно важен.)

2

То есть, что первое выражение в промежутке (A) меньше второго выражения (B), оно не проверяет или не выполняет с противоположной опцией.

например, если вы положили Where 3 Between 4 And 2ни одной строки будет возвращена:

или, если вы пишете

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

вернет false

Смежные вопросы