SQL WHERE子句使用AND / OR运算符

时间:2012-08-11 22:34:29

标签: java android sql sqlite

我有下面的数据库,当我尝试运行一个SQL命令时,它没有做它应该做的事情(下面的代码应该有一个cursorSize为1,但它显示为0)。

我运行的代码是:

SQLiteDatabase db = this.getReadableDatabase();

String countQuery = "SELECT  songid FROM TABLE_TRACKS WHERE (tagid = 7 OR tagid = 10) AND tagid = 9";
Cursor cursor = db.rawQuery(countQuery, null);
int cursorSize = cursor.getCount();

它与where子句有关,因为当我更改括号并使其成为

WHERE (tagid=9 AND tagid = 7) OR tagid=10

它有效,因为int cursorSize是2。 有什么傻事我错过了或者我不了解SQL WHERE子句或AND / OR运算符吗?

如果有人能为我解释这个如何获得我想要的结果,真的很感激。 (下面我想返回一行songid等于3。)

enter image description here

4 个答案:

答案 0 :(得分:2)

结果没有错。它应该给你零,因为:

  • 您无法同时拥有tagid = 7和9的行。
  • 您无法同时拥有tagid = 10和9的行。

您需要检查您的应用逻辑以及您要在此处完成的任务。

修改

So think of songIDs as songs and tagIDs as Tags (guitar, piano, romantic and so on) so if I want to find the songs which has (piano AND guitar) OR romantic tag how is it possible ? do I have to change my db (table) or can I reformulate my sql ?

如果这是您的应用程序的上下文,并且您希望用户使用某些输入组合,我建议您更改数据库方案。尝试为每个标记添加布尔列。如果您期望这样的组合,这将更容易,并且在空间方面不会有太大差异。

答案 1 :(得分:1)

它按预期工作。

首先执行tagid = 7 OR tagid = 10

结果将是

7  2
7  3
10 4

然后AND tagid = 9

现在检查上述结果中的tagid 9

没有任何可用的东西。因此,光标大小为ZERO

答案 2 :(得分:1)

CursorSize为0的原因是您的查询包含逻辑错误。 您的查询显示:(tagid = 7 OR tagid = 10) AND tagid = 9

将此查询视为由AND运算符连接的两个不同条件语句,这意味着如果您的tagid为7并且tagid = 9,那么您的cursorSize会更新。你的tagid如何同时成为7和9?我想如果你想使用songidtagid 7中的tagid 9,你需要做的就是使用7 OR 9。

(tagid=9 AND tagid = 7) OR tagid=10为您提供非零cursorSize的原因是因为现在您正在使用上面建议的OR运算符,所以至少在tagid == 10得到{{1}}的情况下返回数据库条目。

答案 3 :(得分:1)

这个布尔语句:

(tagid = 7 OR tagid = 10) AND tagid = 9

意味着tagid必须同时为7(或10)AND 9。那不行。

这个布尔语句的原因:

(tagid=9 AND tagid = 7) OR tagid=10

有效是因为在tagid中有两行值为10。