【问题标题】:Python: sqlite OR statementPython:sqlite OR 语句
【发布时间】:2010-11-19 03:56:04
【问题描述】:

有 OR sqlite 语句吗?我一直在尝试用谷歌搜索它,但谷歌似乎正在过滤掉 OR

例如如果我想在这个表中找到某人(人)

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

如果名字是 Elvis 或 Richard,我的查询是什么?

我尝试过 select * from people where fname=('Elvis' or 'Richard') 之类的方法,但总是返回 Eric Sc​​hmidt(与我想要的完全相反的行)!

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

我在 Ubuntu 10.10 上使用 Python 2.6 sqlite3 模块。有人可以快速解释一下 sqlite OR 语句还是告诉我它是否不存在?我尝试了 RTFM,但找不到任何东西(在 sqlite 网站上搜索 OR 会吐出一堆错误!)。

谢谢!

【问题讨论】:

  • 您的病情有问题!下面看我的回答,我解释了一下。
  • 如果你 google 'sql +or' 它会更听你的话。
  • 谢谢内特!我会记住的!

标签: python sql linux sqlite ubuntu


【解决方案1】:

这将是其中之一:

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' 或... true”。它将字符串评估为布尔值,我假设因为它不是空的,所以它被评估为真。并继续从表中选择每一行,正如我之前所说的。

【讨论】:

  • 我是IN 的粉丝,因为它易于扩展,括号区分备选列表,体面的文本编辑器可以让您在它们之间来回切换。作为奖励,它看起来很像列表理解:[row for row in people if row.fname in ('Elvis', 'Richard')]
  • 啊哈! IN 是我想要的!谢谢!
【解决方案2】:

“SQLite 逻辑运算符”是我的查询,发现你是这样的:http://zetcode.com/databases/sqlitetutorial/expressions/

至于您的实际结果,您将牛与驴进行比较:D。当你说:

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

你是说:

给我所有来自那些人的行 满足以下条件:确实 fname 等于 Elvis,或者它是真的 理查德。

你得到了所有的行,因为 Richard 被认为是真实的,是一个非空字符串。

你应该做的是:

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

干杯!

【讨论】:

    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:

      OR 是一个返回真或假的逻辑语句。

      所以(“Elvis”或“Richard”)返回可能为假。 而您的实际 SQL 确实是“ fname = False ”。大多数数据库都会抛出错误,但因为 sqlite 内部遵循 TCL 的“一切都是字符串”的理念,所以它是一个有效的语句。

      你需要的很简单:

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

      【讨论】:

        【解决方案5】:

        只是一个快速的,你试过select * from people where fname='Elvis' or fname='Richard'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-14
          • 2014-07-06
          • 2017-12-15
          • 1970-01-01
          相关资源
          最近更新 更多