Java 将IN子句与SQLite一起使用
在使用SQLite 3.7.11和Java的开发环境中,尽管阅读了以下答案: , 我发现SQLite在子句中的用法不是很直截了当 假设一个具有以下结构的简单表格测试:Java 将IN子句与SQLite一起使用,java,android,sqlite,Java,Android,Sqlite,在使用SQLite 3.7.11和Java的开发环境中,尽管阅读了以下答案: , 我发现SQLite在子句中的用法不是很直截了当 假设一个具有以下结构的简单表格测试: ---------------------------- id PRODUCT TAG (int) (text) (text) ---------------------------- 1 Cinthol Soap, Bath, Cleaning 2 Vim
----------------------------
id PRODUCT TAG
(int) (text) (text)
----------------------------
1 Cinthol Soap, Bath, Cleaning
2 Vim Dishwash, Kitchen, Cleaning
3 Burger Food, Breakfast, Lunch, Dinner
以下查询的行为是这样的:
----------------------------------------------------------------------------
Query Result Expected
----------------------------------------------------------------------------
SELECT PRODUCT FROM TEST WHERE TAG IN('Soap') Cinthol Cinthol
SELECT PRODUCT FROM TEST WHERE TAG IN('Dinner') <EMPTY> Burger
SELECT PRODUCT FROM TEST WHERE TAG IN('Soap', 'Bath') <EMPTY> Cinthol
SELECT PRODUCT FROM TEST WHERE TAG IN('Cleaning') <EMPTY> Cinthol, Vim
因此,问题是:
除了第一个查询,为什么其他查询没有生成预期的结果?这种理解有没有根本性的错误?
如果错误,在不使用instr函数的情况下获得预期结果的正确查询是什么?
此外,标记列最终必须与Java中的令牌数组绑定,从而动态构建查询。不过,上面列出的答案都指向这一点
提前谢谢 In子句不是这样工作的。假设每列有一个标记,就可以得到结果。您需要添加另一个表来保留标记。在这个表中,您需要pk、foreign keyid deom测试,和标记,以便每个产品都有多个任务。这是一个您可以改变的解决方案。您最好先搜索数据库notmalization。gl最好的解决方案是数据库规范化。。。此外,所有预期值都应为空。如果不进行规范化,您可以通过标记进行搜索的唯一方法(这是一种糟糕的性能方法)是使用来自测试的SELECT PRODUCT,其中标记为“%Soap%”,您必须通过两侧的管道将其分开,才能像“%| Soap |%”一样搜索,从而防止它获得像Soap2这样的标记。@NarayanaJ,IN子句的工作方式与您的工作方式完全相反。下面是一个简短的示例SELECT*FROM test,其中产品在'Cinthol','Vim'中;应该给你前两行。这意味着:这是该列的一个值列表,请给出该列中的值至少与其中一个值匹配的所有行。。。但下一次,请先学习一些基础知识,然后再提问。。。我也不明白为什么这个问题有+2。。。它不值得upvotesOk的家伙们,他们将花一些时间理解规范化,并满怀希望地返回解决方案。不过,请看。这是一个被接受的答案,我很难理解为什么我的问题会失败。谢谢你们@中的NarayanaJ要求左侧有一个值。