结合使用OR运算符和WHERE

时间:2019-09-21 10:07:11

标签: sql database sqlite rdbms

我研究了如果满足第一个条件,DBMS不会在WHERE子句中评估第二个条件。

select *

from student

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



select *

from student

where name = 'ABC' or 'XYZ';

第一个返回名称为“ ABC”和“ XYZ”的所有行,第二个返回仅名称为“ ABC”的行。

2 个答案:

答案 0 :(得分:2)

SQLite将布尔表达式视为False的{​​{1}}和1的{​​{1}}。
必要时还可在类似

的表达式中将隐式字符串值转换为数字
True

以便对其进行评估。
所以上面的表达式等于:

name = 'ABC' or 'XYZ'

,因此(name = 'ABC') or 'XYZ' 被隐式转换为'XYZ'的数字值,表示0
该表达式的结果是:

False

等效于:

(name = 'ABC') or False

这就是为什么它仅返回名称为“ ABC”的行

的原因

答案 1 :(得分:1)

在第二个查询中,XYZ被视为条件(XYZ-否):

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

<=>

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

<=>

select *
from student
where name = 'ABC';
  

“我研究了如果满足第一个条件,DBMS将不会在WHERE子句中评估第二个条件。”

这取决于short-circuiting并非总是如此。

我想你想要

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