这是检查表中是否存在行的最有效方法吗?
SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");
桌子是...
CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT);
如果该行不存在,那么返回值是什么?是 false (bool) 还是 0 (int) 还是 NULL?
虽然文档没有暗示这一点,但显然主要的 sqlite 开发人员(Richard Hipp)已经在邮件列表中确认
EXISTS
对你来说是短路的。
SQLite 中的查询规划器虽然并不出色,但足够聪明 知道它一看到第一行就可以停止并返回 true 来自 EXISTS() 内部的查询。
因此您提出的查询将是最有效的:
SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");
如果您对可移植性感到紧张,您可以添加限制。我怀疑大多数 DB 都会为您提供相同的短路。
SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag" LIMIT 1);
如果您不需要记录中的某些内容,则选择 1 是可接受的做法,尽管您选择的内容无论如何都不重要。
在标签字段上放置索引。如果不这样做,对不存在标签的查询将进行全表扫描。
EXISTS
表示它将返回 1 或 0,而不是 null。