[SQL]null值被比较的结果问题
场景还原
有一个字段是 已删除 deleted
如果0 则是未删除
如果1 则是已删除
我写的where条件是 deleted != 1
然后数据库里面这个字段的值都是null
我当时就想,null值,也就是不等于1,没毛病,但是就是查不出来,于是我问了一下通义千问,回答如下:
AI回答
理解你的困惑,但实际上在 SQL 中,NULL
的处理方式不同于普通的值。在 SQL 中,NULL
表示“未知”或“不存在”,因此任何与 NULL
的比较都会返回 NULL
,而不是 TRUE
或 FALSE
。这意味着 NULL != 1
的结果是 NULL
,而不是 TRUE
。
解释
在 SQL 中,以下表达式的结果如下:
NULL = 1
结果是NULL
NULL != 1
结果是NULL
NULL IS NULL
结果是TRUE
NULL IS NOT NULL
结果是FALSE
因此,如果你的查询条件是 deleted != 1
,那么 deleted
为 NULL
的记录会被排除在外,因为 NULL != 1
的结果是 NULL
,而不是 TRUE
。
解决方案
为了确保 deleted
为 NULL
的记录也能被查询到,你需要使用 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 |
总结
通过修改查询条件,确保 deleted
为 NULL
的记录也能被正确查询到。希望这能解决你的问题。
版 权 声 明
作者:萌狼蓝天
QQ:3447902411(仅限技术交流,添加请说明方向)
转载请注明原文链接:https://www.cnblogs.com/mllt/p/18526887/sql-where-null