首页 > 解决方案 > PostgreSQL如何将null视为一个值

问题描述

让我们说:

  1. 我有一个名为“movie”的表,它包含一个名为“categoryid”的字段,该字段指向另一个“category”表。

  2. 如果没有为电影选择类别,则字段“categoryid”可以为空。否则它是一个数字。

  3. 我有一个电影搜索页面的用户界面,它以复选框列表的形式列出所有类别,以便用户可以选择多个类别。这个复选框列表还包括一个“未分类”选项,用于选择“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 运算符一起使用?或任何其他将接受允许值列表的运算符?

标签: sqlpostgresqlsql-insql-null

解决方案


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

推荐阅读