用于检查SQLite3中是否存在行的有效查询

saz*_*azr 43 sqlite

这是检查表中是否存在行的最佳(最有效)方法吗?

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");
// Table is...
// CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT);
Run Code Online (Sandbox Code Playgroud)

还有什么是返回值,是假(bool)还是0(int)还是NULL?

Tom*_*err 80

虽然文档并不暗示它,但显然主要的sqlite dev(Richard Hipp)已经在邮件列表确认EXISTS了你的短路.

SQLite中的查询规划器虽然并不精彩,但它足够聪明,只要它看到EXISTS()内部查询的第一行就可以停止并返回true.

因此,您提出的查询将是最有效的:

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");
Run Code Online (Sandbox Code Playgroud)

如果您对可移植性感到紧张,可以添加限制.我怀疑大多数DB会为你提供相同的短路.

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag" LIMIT 1);
Run Code Online (Sandbox Code Playgroud)

如果您不需要记录中的某些内容,则选择1是可接受的做法,尽管您选择的内容无论哪种方式都不重要.

在您的标记字段上添加索引.如果不这样做,查询不存在的标记将执行全表扫描.

EXISTS 声明它将返回1或0,而不是null.

  • @Lynn这是[评论](http://sqlite.1065341.n5.nabble.com/Re-Fastest-way-to-find-whether-at-least-one-row-has-a-certain-column-来自SQLite的原作者Richard Hipp的值-td87944.html):"SQLite中的查询规划器虽然并不精彩,但它足够聪明,知道它可以在看到查询的第一行时停止并返回true在EXISTS()里面." (8认同)
  • `EXISTS`总是返回一个结果,所以只检查该值就行了. (3认同)
  • @BenSewards最初的问题不是语言特定的,所以我只能在你的平台上猜测这是正确的.我建议尝试一下. (2认同)
  • @BenSewards您可以使用别名方法,例如: SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag") AS alias_naming; 然后你可以使用cursor.getInt(“alias_naming”)来获取该值。 (2认同)

小智 10

再次,引用文档:

EXISTS运算符始终求值为整数值0和1之一.如果执行指定为EXISTS运算符的右侧操作数的SELECT语句将返回一行或多行,则EXISTS运算符的计算结果为1.如果执行SELECT根本不返回任何行,然后EXISTS运算符的计算结果为0.

关于使用EXISTS是否比使用更有效count(*),这可能取决于表的大小以及表是否具有索引.尝试对两个查询进行EXPLAIN以进行基准测试(或者仅对每个查询进行计时).