[SQL]null值被比较的结果问题

场景还原

有一个字段是 已删除 deleted

如果0 则是未删除
如果1 则是已删除

我写的where条件是 deleted != 1
然后数据库里面这个字段的值都是null

我当时就想,null值,也就是不等于1,没毛病,但是就是查不出来,于是我问了一下通义千问,回答如下:

AI回答

理解你的困惑,但实际上在 SQL 中,NULL 的处理方式不同于普通的值。在 SQL 中,NULL 表示“未知”或“不存在”,因此任何与 NULL 的比较都会返回 NULL,而不是 TRUEFALSE。这意味着 NULL != 1 的结果是 NULL,而不是 TRUE

解释

在 SQL 中,以下表达式的结果如下:

  • NULL = 1 结果是 NULL
  • NULL != 1 结果是 NULL
  • NULL IS NULL 结果是 TRUE
  • NULL IS NOT NULL 结果是 FALSE

因此,如果你的查询条件是 deleted != 1,那么 deletedNULL 的记录会被排除在外,因为 NULL != 1 的结果是 NULL,而不是 TRUE

解决方案

为了确保 deletedNULL 的记录也能被查询到,你需要使用 IS NULL 条件来处理 NULL 值。具体来说,可以将 deleted != 1 修改为 deleted != 1 OR deleted IS NULL

修改后的 SQL 查询

SELECT * 
FROM menu_data_item 
WHERE (deleted != 1 OR deleted IS NULL) 
AND id IN (
    SELECT system_role_menu.menu_id 
    FROM system_role_menu 
    WHERE role_id = 'root'
)

示例

假设你有以下数据:

id title icon path component redirect affix parent_id name hide_in_menu url hide_in_breadcrumb hide_children_in_menu keep_alive target locale deleted
001 首页 DashboardOutlined /dashboard RouteView /dashboard/analysis 0 NULL Dashboard 0 NULL 0 0 0 NULL menu.dashboard NULL
100 系统设置 BarsOutlined /system RouteView /system/user NULL NULL System NULL NULL NULL NULL NULL NULL menu.system NULL
101 用户管理 BarsOutlined /system/user /system/user NULL NULL 100 SystemUserManage NULL NULL NULL NULL 1 NULL menu.system.user NULL
102 菜单管理 BarsOutlined /system/menu /system/menu NULL NULL 100 SystemMenuManage NULL NULL NULL NULL 1 NULL menu.system.menu NULL
020 数据中心 DashboardOutlined /dashboard/analysis /dashboard/analysis NULL 0 001 DashboardAnalysis 0 NULL 0 0 1 NULL menu.dashboard.analysis NULL

运行修改后的查询:

SELECT * 
FROM menu_data_item 
WHERE (deleted != 1 OR deleted IS NULL) 
AND id IN (
    SELECT system_role_menu.menu_id 
    FROM system_role_menu 
    WHERE role_id = 'root'
)

预期结果:

id title icon path component redirect affix parent_id name hide_in_menu url hide_in_breadcrumb hide_children_in_menu keep_alive target locale deleted
001 首页 DashboardOutlined /dashboard RouteView /dashboard/analysis 0 NULL Dashboard 0 NULL 0 0 0 NULL menu.dashboard NULL
100 系统设置 BarsOutlined /system RouteView /system/user NULL NULL System NULL NULL NULL NULL NULL NULL menu.system NULL
101 用户管理 BarsOutlined /system/user /system/user NULL NULL 100 SystemUserManage NULL NULL NULL NULL 1 NULL menu.system.user NULL
102 菜单管理 BarsOutlined /system/menu /system/menu NULL NULL 100 SystemMenuManage NULL NULL NULL NULL 1 NULL menu.system.menu NULL
020 数据中心 DashboardOutlined /dashboard/analysis /dashboard/analysis NULL 0 001 DashboardAnalysis 0 NULL 0 0 1 NULL menu.dashboard.analysis NULL

总结

通过修改查询条件,确保 deletedNULL 的记录也能被正确查询到。希望这能解决你的问题。

posted @ 2024-11-04 22:34  萌狼蓝天  阅读(7)  评论(0编辑  收藏  举报