【问题标题】:SQL: how to SELECT by value if value can be nullSQL:如果值可以为空,如何按值选择
【发布时间】:2018-06-03 17:06:09
【问题描述】:

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

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

【问题讨论】:

    标签: sql sqlite select android-room isnull


    【解决方案1】:

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

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

    SELECT * FROM category WHERE parent_id IS :parentId
    

    【讨论】:

    • 抱歉,回复晚了,这行得通。非常感谢!
    【解决方案2】:

    我认为你只需要一个稍微复杂一点的条件:

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

    【讨论】:

    • 我试过了,但无法成功。来自 CL 的回答。工作。
    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2012-01-24
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多