SQL:如果值可以为空,如何按值 SELECT

SQL: how to SELECT by value if value can be null

我有一个数据库table "Category"可以自引用。如果 self-reference 为 null,则它是顶级类别(无父类别)。如果它指向另一个类别,则它是给定类别的子类别。

现在我正在尝试设置查询,其中 return 具有给定父类别 ID 的所有子类别。类似于以下内容(Android 房间语法):

"SELECT * FROM category WHERE parent_id = :parentId"

如果 parentId == null,此查询 return 没有任何内容,但我希望它 return parentId == null 的所有类别(即顶级类别)。有查询

"SELECT * FROM category WHERE parent_id IS NULL"

我可以成功获取父类别,但显然,它不适用于子类别。

我也尝试了以下查询

"SELECT * FROM category WHERE (parent_id IS NULL OR parent_id = :parentId)

但它当然会失败,因为它总是 return 的顶级类别,即使其目的是只获取特定的子类别集。

我的问题是,如何设置我的查询以使其按预期工作,即当 parentId == null 时 return 是所有顶级类别,否则 return 都是给定类别 ID 的子类别。

我想你只需要稍微复杂一点的条件:

SELECT c.*
FROM category c
WHERE (c.parent_id IS NULL AND :parentId IS NULL) OR
      (parent_id = :parentId);

SQL 标准要求对 NULL 值进行这种处理。

但是 SQLite 有一个扩展:你也可以使用 IS 和非 NULL 值:

SELECT * FROM category WHERE parent_id IS :parentId