我研究了如果满足第一个条件,DBMS不会在WHERE子句中评估第二个条件。
select *
from student
where name = 'ABC' or name ='XYZ';
select *
from student
where name = 'ABC' or 'XYZ';
第一个返回名称为“ ABC”和“ XYZ”的所有行,第二个返回仅名称为“ ABC”的行。
答案 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