sql - PostgreSQL如何将null视为一个值
问题描述
让我们说:
我有一个名为“movie”的表,它包含一个名为“categoryid”的字段,该字段指向另一个“category”表。
如果没有为电影选择类别,则字段“categoryid”可以为空。否则它是一个数字。
我有一个电影搜索页面的用户界面,它以复选框列表的形式列出所有类别,以便用户可以选择多个类别。这个复选框列表还包括一个“未分类”选项,用于选择“categoryid”为空的电影
现在用户正在选择 null 和多个其他复选框,这反映在 SQL 代码中,如下所示:
SELECT * FROM movie WHERE categoryid in (1, 5, 9, NULL);
显然,上面的代码不起作用。我猜 null 不被视为一个值是 SQL 就像它在其他语言中一样!未分类的电影被过滤掉了。但是下面的代码有效
SELECT * FROM movie WHERE categoryid IN (1, 5, 9) OR categoryid IS NULL;
但不幸的是,我使用的框架不能例外,而且我对数据库的结构没有灵活性,因为它是由另一个软件生成的。那么,有什么方法可以将 NULL 值与 IN 运算符一起使用?或任何其他将接受允许值列表的运算符?
解决方案
IN
不幸的是,不适用于NULL
值。另一种方法是将值放在派生表中,并使用IS NOT DISTINCT FROM
:
select m.*
from movie m
inner join (values (1), (5), (9), (null)) v(val)
on v.val is not distinct from m.category_id
您的应用程序将值列表作为数组传递可能更方便:
select m.*
from movie m
inner join unnest(array[1, 5, 9, null]) v(val)
on v.val is not distinct from m.category_id
推荐阅读
- python - 在 Django 中提交表单时重定向到带有参数的视图
- jasper-reports - 如何将文本字段列表与左对齐对齐
- reactjs - 在反应上下文中传递多个状态
- amazon-cloudformation - 有没有办法从 AWS CDK 中的 qldb.CfnLedger 获取生成的 QLDB 分类帐名称?
- javascript - 如何在多个 HTML 元素上调用相同的 JavaScript 函数?
- django - CreateView ModelForm 多条记录一次
- asp.net-web-api2 - 尝试在我的 Web Api 2 中发布图像时不受支持的媒体类型
- python - AttributeError:词汇属性已从 Gensim 4.0.0 中的 KeyedVector 中删除
- vue.js - 使用 Vee-Validate 的问题
和 Vue 多选 - html - 使用标签内的“标题”属性的工具提示在 iphone / ipad 浏览器中不起作用