问题描述
考虑一个数据库,该数据库对目录树进行建模,并且每个文件或文件夹都是一条记录:
CREATE TABLE "tree" (
"id" integer,"parent_id" integer,"name" varchar(255),UNIQUE("parent_id","name"),PRIMARY KEY("id"),FOREIGN KEY("parent_id") REFERENCES "tree"("id") on delete cascade
);
根节点没有父节点,所以将parent_id设置为NULL。 为了优化运行时,我想创建一个准备好的语句来查询树:
select * from tree where name=? and parent_id=?
问题在于,即使我调用sqlite3_bind_null,使用上述语句,select语句也不会找到parent_id为NULL的行。它仅适用于参数parent_id is null
。
当前准备了两个语句:一个用于NULL,一个用于!= NULL,但这不是很优雅。 还有另一种方法可以做到这一点吗?
解决方法
您想要null
-安全的相等性。在SQLite中,您可以使用is
:
select *
from tree
where name = ? and parent_id is ?
这是如何工作的https://lxml.de/xpathxslt.html#namespaces-and-prefixes:
IS
和IS NOT
运算符的工作方式类似于=
和!=
,除非一个或两个操作数均为NULL
。在这种情况下,如果两个操作数均为NULL
,则IS
运算符的值为1(true),而IS NOT
运算符的值为0(false)。如果一个操作数是NULL
,而另一个不是,则IS
运算符的值为0(假),而IS NOT
运算符的值为1(真)。