sql - SQL:如果值可以为空,如何按值选择
问题描述
我有一个可以自我引用的数据库表“类别”。如果 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 标准要求对 NULL 值进行这种处理。
但是 SQLite 有一个扩展:您也可以将 IS 与非 NULL 值一起使用:
SELECT * FROM category WHERE parent_id IS :parentId
推荐阅读
- python - 有没有办法在 seaborn 点图中设置透明度/alpha 级别?
- css - 具有可变边框宽度的css圆形掩码
- python - 将发票图像转换为可编辑格式
- r - Facet_grid labeller 所有标签的重复级别
- javascript - pub/sub 模式的模块与对象构造函数的权衡?
- node.js - MongoDB 查询以查找具有变体的文档
- python - 如何使用 IMAP 获取正文消息
- json - 解析 avsc 文件以获取所需格式的键值对
- reactjs - 通过在 Reactjs 上运行数组来创建组件
- java - E/AndroidRuntime:致命异常:主 PID:19302 java.lang.RuntimeException:无法启动活动 ComponentInfo