SQL:如果value可以为null,如何按值进行SELECT

时间:2018-06-03 17:06:09

标签: sql sqlite select android-room isnull

我有一个数据库表"类别"哪个可以自我参考。如果自引用为空,则它是顶级类别(无父级)。如果它指向另一个类别,则它是给定类别的子类别。

现在我尝试设置查询,该查询返回给定父类别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的所有子类别。

2 个答案:

答案 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);