Java 使用AND/OR运算符的SQL WHERE子句
我有下面的DB,当我尝试运行SQL命令时,它并没有完成它应该做的事情(下面的代码应该有一个Java 使用AND/OR运算符的SQL WHERE子句,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我有下面的DB,当我尝试运行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.rawQu
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
)
结果没有问题。它应该给你零,因为:
- 不可能有一行的tagid同时为7和9
- 不可能有一行的tagid同时为10和9
因此,将SongID视为歌曲,TagID视为标签(吉他、钢琴、浪漫等等),那么如果我想找到有(钢琴和吉他)或浪漫标签的歌曲,怎么可能呢?我必须更改数据库(表)还是可以重新格式化sql?
如果这是应用程序的上下文,并且您希望用户提供一些输入组合,我建议您更改db方案。尝试为每个标记添加布尔列。如果您期望这样的组合,这将更容易,并且在空间方面不会有太大的差异。结果没有什么问题。它应该给你零,因为:
- 不可能有一行的tagid同时为7和9
- 不可能有一行的tagid同时为10和9
因此,将SongID视为歌曲,TagID视为标签(吉他、钢琴、浪漫等等),那么如果我想找到有(钢琴和吉他)或浪漫标签的歌曲,怎么可能呢?我必须更改数据库(表)还是可以重新格式化sql?
如果这是应用程序的上下文,并且您希望用户提供一些输入组合,我建议您更改db方案。尝试为每个标记添加布尔列。如果您希望使用这样的组合,这将更容易,而且在空间方面不会有太大差异。它正在按预期工作 首先执行
tagid=7或tagid=10
因此,结果将是肯定的
7 2
7 3
10 4
然后和tagid=9
现在检查上述结果中的tagid 9
没有可用的。因此,光标大小为零,它按预期工作 首先执行
tagid=7或tagid=10
因此,结果将是肯定的
7 2
7 3
10 4
然后和tagid=9
现在检查上述结果中的tagid 9
没有可用的。因此,游标大小为0。游标大小为0的原因是查询包含逻辑错误。 您的查询显示:
(tagid=7或tagid=10)和tagid=9
将此查询视为由AND运算符连接的两个不同的条件语句,这意味着如果tagid
为7且tagid=9
,则更新cursorSize
。你的tagid
怎么可能同时是7和9?我认为如果您想使用tagid 7
和tagid 9
中的songid
,您需要做的是使用7或9
(tagid=9和tagid=7)或tagid=10
为您提供非零的光标大小的原因是,您正在使用我上面建议的OR运算符,因此至少在tagid==10
的情况下,您会返回一个数据库条目。游标大小为0的原因是因为您的查询包含逻辑错误。
您的查询显示:(tagid=7或tagid=10)和tagid=9
将此查询视为由AND运算符连接的两个不同的条件语句,这意味着如果tagid
为7且tagid=9
,则更新cursorSize
。你的tagid
怎么可能同时是7和9?我认为如果您想使用tagid 7
和tagid 9
中的songid
,您需要做的是使用7或9
(tagid=9和tagid=7)或tagid=10
为您提供非零的游标大小的原因是,您现在使用的是我上面建议的OR运算符,因此至少在tagid==10
的情况下,您会返回一个数据库条目。此布尔语句:
(tagid = 7 OR tagid = 10) AND tagid = 9
(tagid=9 AND tagid = 7) OR tagid=10
表示tagid
必须同时为7(或10)和9。那是行不通的
使用此布尔语句的原因:
(tagid = 7 OR tagid = 10) AND tagid = 9
(tagid=9 AND tagid = 7) OR tagid=10
之所以有效,是因为此布尔语句中有两行的值为10:
(tagid = 7 OR tagid = 10) AND tagid = 9
(tagid=9 AND tagid = 7) OR tagid=10
表示tagid
必须同时为7(或10)和9。那是行不通的
使用此布尔语句的原因:
(tagid = 7 OR tagid = 10) AND tagid = 9
(tagid=9 AND tagid = 7) OR tagid=10
之所以有效,是因为tagid
中有两行的值为10,如果tagid
列中只有一个值,那么任何一行怎么可能有两个tagid
s?因为(tagid=7或tagid=10)和tagid=9
要求tagid
等于9
和另一个数字……如果您只需要两个组合,那么将表本身连接起来就行了:使用(A.tagid=7或A.tagid=10)从表中选择不同的songid作为左连接表和B.tagid=10
。tagid有A和B两个版本,因此您可以选择行。如果在tagid
列中只有一个值,那么任何行怎么可能有两个值<