场景还原

有一个字段是 已删除 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 的记录也能被正确查询到。希望这能解决你的问题。

[SQL]null值被比较的结果问题的更多相关文章

  1. SQL NULL 值【摘自W3C】

    SQL NULL 值 本章讲解 IS NULL 和 IS NOT NULL 操作符. NULL 值是遗漏的未知数据.默认地,表的列可以存放 NULL 值. 如果表中的某个列是可选的,那么我们可以在不向 ...

  2. SQL NULL 值

    NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...

  3. SQL-W3School-高级:SQL NULL 值

    ylbtech-SQL-W3School-高级:SQL NULL 值 1.返回顶部 1. NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS N ...

  4. sql null值

    SQL Server 提供 SET CONCAT_NULL_YIELDS_NULL { ON | OFF } 来控制 null 与其它字符串连接的行为. 当 SET CONCAT_NULL_YIELD ...

  5. SQL null值 查询null

    select * from emp;

  6. 22.NULL 值

    NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...

  7. SQL中NULL值

    SQL的表达式,除了IS NULL和NOT NULL以外,只要出现NULL值结果都为FALSE 简单的例子: SELECT * FROM table WHERE name!='abc' 只要name值 ...

  8. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  9. SQL SERVER使用ODBC 驱动建立的链接服务器调用存储过程时参数不能为NULL值

    我们知道SQL SERVER建立链接服务器(Linked Server)可以选择的驱动程序非常多,最近发现使用ODBC 的 Microsoft OLE DB 驱动程序建立的链接服务器(Linked S ...

  10. mysql,sql server,oracle 唯一索引字段是否允许出现多个 null 值?

    最近一个项目,涉及到sql server 2008,因为业务需求,希望建立一个唯一索引,但是发现在sql server中,唯一索引字段不能出现多个null值,下面是报错信息: CREATE UNIQU ...

随机推荐

  1. LeetCode 730. Count Different Palindromic Subsequences (区间DP)

    题意 给一个字符串S,求它所有子序列中不同非空回文串的数量.字符串由 'a' 'b' 'c' 'd' 四个字母组成. 由于题目要求的是不同回文串. abba 的回文串子序列为 a,b,aba,abba ...

  2. USB gadget configfs

    概述 USB Linux Gadget是一种具有UDC (USB设备控制器)的设备,可以连接到USB主机,以扩展其附加功能,如串口或大容量存储能力. 一个gadget被它的主机视为一组配置,每个配置都 ...

  3. 强化学习笔记之【SAC算法】

    强化学习笔记之[SAC算法] 前言: 本文为强化学习笔记第四篇,第一篇讲的是Q-learning和DQN,第二篇DDPG,第三篇TD3 TD3比DDPG少了一个target_actor网络,其它地方有 ...

  4. jacoco代码覆盖率工具配置

    参考文章: https://blog.csdn.net/skh2015java/article/details/121775806 解决引入jacoco依赖并配置后,执行maven clean tes ...

  5. appium-解决uiautomatorviewer不能定位android7以上版本元素的方法

    上图是android10模拟器,发现我们是无法连接模拟器识别的 解决方法: 在模拟器内打开指定页面然后截图,最后保存为uix文件,然后用adb拉到本地,一共四个命令,可以保存为.bat文件快捷执行(这 ...

  6. TCP-UDP-Socket调试工具以及使用教程(亲测好用!)

    前言 TCP-UDP老程序都不陌生吧,面试常问.所以在网络编程与网络应用开发的过程中,调试是一个至关重要的环节,它帮助开发者确保数据能够准确无误地在不同节点之间传输.尤其当涉及到TCP/IP.UDP等 ...

  7. AI年代,谁还用难用的Keil?快快换CLion!!! 破解+环境替换 [上]

    安装Clion 由于这个地方碰壁比较多,所以大家严格按照我下面的安装节奏就可以了! 记得CLion的版本等,和我所说的不匹配也会导致破解失败. 包能破解安装上的. 1.下载 链接:https://pa ...

  8. 2-5 C++ 类型别名与自动类型

    目录 2.5.1 类型别名(Type Alias) typedef using 2.5.2 auto类型说明符 基本说明 注意点 2.5.3 decltype类型说明符 基本说明 注意点 2.5.1 ...

  9. 18.Kubernetes容器交付介绍

    Kubernetes容器交付介绍 如何在k8s集群中部署Java项目 容器交付流程 开发代码阶段 编写代码 编写Dockerfile[打镜像做准备] 持续交付/集成 代码编译打包 制作镜像 上传镜像仓 ...

  10. linux系统查看日志方法

    linux查看日志可以使用tail.cat.less.grep等实现,linux系统的日志通常是存在/var/log中 1.使用cat命令:cat /var/log,log目录下还有多种类型的日志文件 ...