Python: sqlite 或语句

3 投票
5 回答
5792 浏览
提问于 2025-04-16 07:18

有没有一个 OR 的 sqlite 语句?我试着在网上查,但谷歌好像把 OR 给过滤掉了。

比如说,如果我想在这个表(people)里找一个名字是 Elvis 或者 Richard 的人,我该怎么写查询呢?

people:
+--fname--+--lname--+--has_squirrel--+
|Eric     |Schmidt  |0               |
+---------+---------+----------------+
|Elvis    |Presley  |1               |
+---------+---------+----------------+
|Richard  |Stallman |0               |
+---------+---------+----------------+

我试过像 select * from people where fname=('Elvis' or 'Richard') 这样的写法,但总是返回 Eric Schmidt(这正好是我想要的相反的结果)!

我也试过 select * from people where fname='Elvis' or 'Richard',但这返回了表里的 所有 行!

我在 Ubuntu 10.10 上使用的是 Python 2.6 的 sqlite3 模块。有人能给我简单解释一下 sqlite 的 OR 语句吗?或者告诉我它是不是不存在?我试着查手册,但找不到任何信息(在 sqlite 网站上搜索 OR 会出现一堆错误!)。

谢谢!

5 个回答

0

试试这个:

select * from people where fname = 'Elvis' or  fname = 'Richard'
3

我搜索了“SQLite 逻辑运算符”,找到了这个链接:http://zetcode.com/databases/sqlitetutorial/expressions/

关于你实际的结果,你是在拿牛和驴比较 :D。当你说:

select * from people where fname='Elvis' or 'Richard'

你其实是在说:

给我所有满足以下条件的人的记录:fname 等于 Elvis,或者 fname 等于 Richard。

你会得到所有的记录,因为 Richard 被认为是“真”,因为它是一个非空字符串。

你应该这样做:

select * from people where fname='Elvis' or fname='Richard'

干杯!

21

这可能是这样的:

SELECT * FROM people WHERE fname IN ('Elvis', 'Richard');
SELECT * FROM people WHERE fname = 'Elvis' OR fname = 'Richard';

我很惊讶你第一个查询居然能工作,而在你的第二个查询中,or 'Richard' 基本上就相当于 or 1=1,这在你的表中总是成立的。

你的电脑思考方式和你不一样。即使 fname = 'Elvis' or 'Richard' 对你来说看起来很明显,但关系数据库管理系统(RDBMS)并不知道你想表达什么,它会理解为“如果 fname 等于 'Elvis' 或者... 是真的”。它会把这个字符串当成一个布尔值来判断,我猜因为这个字符串不为空,所以它被判断为真的。然后就会选择你表中的每一行,正如我之前所说的。

撰写回答