我有一个数据库表"类别"哪个可以自我参考。如果自引用为空,则它是顶级类别(无父级)。如果它指向另一个类别,则它是给定类别的子类别。
现在我尝试设置查询,该查询返回给定父类别ID的所有子类别。类似于以下内容(Android Room语法):
"SELECT * FROM category WHERE parent_id = :parentId"
如果parentId == null,则此查询不返回任何内容,但我希望它返回parentId == null(即顶级类别)的所有类别。带有查询
"SELECT * FROM category WHERE parent_id IS NULL"
我可以成功获得父类别,但很明显,它不适用于子类别。
我还尝试了以下查询
"SELECT * FROM category WHERE (parent_id IS NULL OR parent_id = :parentId)
但它当然失败了,因为它总是返回顶级类别,即使目的是只获得某些子类别。
我的问题是,如何设置查询以使其按预期工作,即在parentId == null时返回所有顶级类别,否则返回给定类别ID的所有子类别。
答案 0 :(得分:1)
SQL标准要求处理NULL值。
但是SQLite有一个扩展名:你可以使用IS也使用非NULL值:
SELECT * FROM category WHERE parent_id IS :parentId
答案 1 :(得分:0)
我认为你只需要一个稍微复杂的条件:
SELECT c.*
FROM category c
WHERE (c.parent_id IS NULL AND :parentId IS NULL) OR
(parent_id = :parentId);