Использование оператора ИЛИ с WHERE - PullRequest
0 голосов
/ 21 сентября 2019

Я изучил, что СУБД не будет оценивать второе условие в предложении WHERE, если выполнено первое условие.

select *

from student

where name = 'ABC' or name ='XYZ';



select *

from student

where name = 'ABC' or 'XYZ';

Первое возвращает все строки с именами 'ABC' и 'XYZ'в то время как второй возвращает только строки с именем 'ABC'.

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

SQLite обрабатывает логические выражения как 0 для False и 1 для True.Также преобразует неявно строковые значения в числа при необходимости в выражениях, таких как:

name = 'ABC' or 'XYZ'

для их оценки.Таким образом, вышеприведенное выражение эквивалентно:

(name = 'ABC') or 'XYZ'

, и поэтому 'XYZ' неявно преобразуется в числовое значение 0, означающее False.Результат этого выражения:

(name = 'ABC') or False

, что эквивалентно:

name = 'ABC'

Именно поэтому оно возвращает только строки с именем 'ABC'

1 голос
/ 21 сентября 2019

Во втором запросе XYZ рассматривается как условие (XYZ - ложь):

select *
from student
where name = 'ABC' or 'XYZ';

<=>

select *
from student
where name = 'ABC' or false;

<=>

select *
from student
where name = 'ABC';

"Я изучал, что СУБД не будет оценивать второе условие в ГДЕпредложение, если первое условие выполнено. "

Зависит от того, короткое замыкание не всегда так.

Полагаю, вы хотите:

select *
from student
where name IN('ABC', 'XYZ'); -- basically the same as your first query
...