Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AND/OR运算符的SQL WHERE子句_Java_Android_Sql_Sqlite - Fatal编程技术网

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

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

我有下面的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.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
列中只有一个值,那么任何行怎么可能有两个值<