[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结果是NULLNULL != 1结果是NULLNULL IS NULL结果是TRUENULL 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 的记录也能被正确查询到。希望这能解决你的问题。
[SQL]null值被比较的结果问题的更多相关文章
- SQL NULL 值【摘自W3C】
SQL NULL 值 本章讲解 IS NULL 和 IS NOT NULL 操作符. NULL 值是遗漏的未知数据.默认地,表的列可以存放 NULL 值. 如果表中的某个列是可选的,那么我们可以在不向 ...
- SQL NULL 值
NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...
- SQL-W3School-高级:SQL NULL 值
ylbtech-SQL-W3School-高级:SQL NULL 值 1.返回顶部 1. NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS N ...
- sql null值
SQL Server 提供 SET CONCAT_NULL_YIELDS_NULL { ON | OFF } 来控制 null 与其它字符串连接的行为. 当 SET CONCAT_NULL_YIELD ...
- SQL null值 查询null
select * from emp;
- 22.NULL 值
NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...
- SQL中NULL值
SQL的表达式,除了IS NULL和NOT NULL以外,只要出现NULL值结果都为FALSE 简单的例子: SELECT * FROM table WHERE name!='abc' 只要name值 ...
- SQL Server表分区的NULL值问题
SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...
- SQL SERVER使用ODBC 驱动建立的链接服务器调用存储过程时参数不能为NULL值
我们知道SQL SERVER建立链接服务器(Linked Server)可以选择的驱动程序非常多,最近发现使用ODBC 的 Microsoft OLE DB 驱动程序建立的链接服务器(Linked S ...
- mysql,sql server,oracle 唯一索引字段是否允许出现多个 null 值?
最近一个项目,涉及到sql server 2008,因为业务需求,希望建立一个唯一索引,但是发现在sql server中,唯一索引字段不能出现多个null值,下面是报错信息: CREATE UNIQU ...
随机推荐
- LeetCode 730. Count Different Palindromic Subsequences (区间DP)
题意 给一个字符串S,求它所有子序列中不同非空回文串的数量.字符串由 'a' 'b' 'c' 'd' 四个字母组成. 由于题目要求的是不同回文串. abba 的回文串子序列为 a,b,aba,abba ...
- USB gadget configfs
概述 USB Linux Gadget是一种具有UDC (USB设备控制器)的设备,可以连接到USB主机,以扩展其附加功能,如串口或大容量存储能力. 一个gadget被它的主机视为一组配置,每个配置都 ...
- 强化学习笔记之【SAC算法】
强化学习笔记之[SAC算法] 前言: 本文为强化学习笔记第四篇,第一篇讲的是Q-learning和DQN,第二篇DDPG,第三篇TD3 TD3比DDPG少了一个target_actor网络,其它地方有 ...
- jacoco代码覆盖率工具配置
参考文章: https://blog.csdn.net/skh2015java/article/details/121775806 解决引入jacoco依赖并配置后,执行maven clean tes ...
- appium-解决uiautomatorviewer不能定位android7以上版本元素的方法
上图是android10模拟器,发现我们是无法连接模拟器识别的 解决方法: 在模拟器内打开指定页面然后截图,最后保存为uix文件,然后用adb拉到本地,一共四个命令,可以保存为.bat文件快捷执行(这 ...
- TCP-UDP-Socket调试工具以及使用教程(亲测好用!)
前言 TCP-UDP老程序都不陌生吧,面试常问.所以在网络编程与网络应用开发的过程中,调试是一个至关重要的环节,它帮助开发者确保数据能够准确无误地在不同节点之间传输.尤其当涉及到TCP/IP.UDP等 ...
- AI年代,谁还用难用的Keil?快快换CLion!!! 破解+环境替换 [上]
安装Clion 由于这个地方碰壁比较多,所以大家严格按照我下面的安装节奏就可以了! 记得CLion的版本等,和我所说的不匹配也会导致破解失败. 包能破解安装上的. 1.下载 链接:https://pa ...
- 2-5 C++ 类型别名与自动类型
目录 2.5.1 类型别名(Type Alias) typedef using 2.5.2 auto类型说明符 基本说明 注意点 2.5.3 decltype类型说明符 基本说明 注意点 2.5.1 ...
- 18.Kubernetes容器交付介绍
Kubernetes容器交付介绍 如何在k8s集群中部署Java项目 容器交付流程 开发代码阶段 编写代码 编写Dockerfile[打镜像做准备] 持续交付/集成 代码编译打包 制作镜像 上传镜像仓 ...
- linux系统查看日志方法
linux查看日志可以使用tail.cat.less.grep等实现,linux系统的日志通常是存在/var/log中 1.使用cat命令:cat /var/log,log目录下还有多种类型的日志文件 ...