Выберите между значениями столбцов
Вопрос
Я пытаюсь использовать между именами столбцов вместо прямых значений, что-то вроде этого:
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 рядов .. В обоих случаях я получаю только строки, где значение Column1 на самом деле является средним значением, но 2-й метод дает мне гораздо больше результатов, поэтому 1-й метод имеет что-то не так.
Я подозреваю, что проблема может быть включена в использование между ними с именами столбцов вместо чистых значений, и как-то SQL преобразует имена столбцов на фактические значения .. Странно, но может кто-то просветить меня, пожалуйста? Спасибо
Решение
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
Эд, вы получаете дополнительные строки.
Другие советы
Between A And B
предполагает что A<B
, то есть, что первое выражение в между ними, (A
) меньше, чем второе выражение, (B
) Он не проверяет или не выполняет противоположный вариант.
например, если вы положите Where 3 Between 4 And 2
нет рядов будет возвращен:
или, если вы пишете
Select Case When 3 Between 4 and 2 then 'true' else 'false' end
Это вернется false
Ваша логика для двух утверждений не то же самое:
SELECT * FROM table WHERE (column1 <= column2 AND column1 >= column3) OR (column1 >= column2 AND column1 <= column3)
Имеет два пункта. Удалите первый, и вы должны иметь те же результаты, что и между оператором.
SELECT * FROM table WHERE (column1 >= column2 AND column1 <= column3)
(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 ..
Оператор на самом деле важен.)