Вопрос

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

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 .. Оператор на самом деле важен.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top