1

考虑一个数据库,它为目录树建模,每个文件或文件夹都是一条记录:

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,但这不是很优雅。还有另一种方法可以做到这一点吗?

4

1 回答 1

1

你想要null-安全的平等。在 SQLite 中,您可以使用is

select * 
from tree 
where name = ? and parent_id is ?

文档中解释了这是如何工作的:

ISand运算符的IS NOT工作方式与 and 类似=!=除非其中一个或两个操作数是NULL。在这种情况下,如果两个操作数都是NULL,则IS运算符的计算结果为 1(真),而IS NOT运算符的计算结果为 0(假)。如果一个操作数是NULL而另一个不是,则IS运算符的计算结果为 0(假)并且IS NOT运算符为 1(真)。

于 2020-09-28T22:17:52.917 回答