【问题标题】:How to handle null value in sqlite prepared statement如何处理sqlite准备语句中的空值
【发布时间】:2020-09-28 22:13:08
【问题描述】:

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

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,但这不是很优雅。 有没有其他方法可以做到这一点?

【问题讨论】:

    标签: c++ c sqlite where-clause sql-null


    【解决方案1】:

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

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

    它的工作原理是explained in the documentation:

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

    【讨论】:

    • 确实有效!但不幸的是,它大约是。现在慢 2.5 倍。 (顺便说一句。我没有投反对票,我觉得它很有用)。
    • @MiB_Coder:我想这是为 null 安全功能付出的代价......(name, parent_id) 或 (parent_id, name) 上的索引可能有助于查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多