如何在sqlite准备好的语句中处理空值

问题描述

考虑一个数据库,该数据库对目录树进行建模,并且每个文件文件夹都是一条记录:

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

ISIS NOT运算符的工作方式类似于=!=,除非一个或两个操作数均为NULL。在这种情况下,如果两个操作数均为NULL,则IS运算符的值为1(true),而IS NOT运算符的值为0(false)。如果一个操作数是NULL,而另一个不是,则IS运算符的值为0(假),而IS NOT运算符的值为1(真)。