场景还原

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

[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. Spring事务的1道面试题

    每次聊起Spring事务,好像很熟悉,又好像很陌生.本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点. 原理 Spring事务的原理是:通过AOP切面的方式实现的,也就是通过代理模式 ...

  2. 【官宣】2024 DTC数据技术嘉年华全议程发布:汇聚行业精英,共襄年度盛宴

    龙腾四海内,风云际会时.由墨天轮数据社区和中国数据库联盟(ACDU)主办的第十三届数据技术嘉年华 将于2024年4月12日至13日在北京新云南皇冠假日酒店盛大召开.本次大会的主题是"智能·云 ...

  3. go frame资源管理打包失败

    最近有个需求,需要使用golang做一个小工具,然后我就想既然是小工具,那就把前后端放在一个二进制文件中.恰好使用的项目架构是go frame,它已经提供了这样的能力,但是没想到碰到了一鼻子灰... ...

  4. mysql进阶-索引篇

    索引(SQL主要的优化方式) 介绍: 索引(index)是帮助MySQL高效获取数据的数据结构(有序).在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据 ...

  5. KubeSphere 社区双周报|2024.02.01-02.29

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  6. 云原生周刊:开发人员使用 GPT-4 的 30 种重要方法 | 2023-6-5

    OpenAI 最新的大型语言模型 GPT-4 有非常多的用途,那么,作为开发人员,应该如何去使用它,来帮助自己工作呢? 在最近的 Hacker News 问答中,很多开发人员参与了讨论和分享. 也有人 ...

  7. Visual Studio 2022只能使用WSL调试问题处理

    删除项目的Properties目录下面的launchSettings.json文件

  8. AI绘画漫谈——从AI网页生成说起

    1. 又说"前端已死" 为什么说"又"呢?因为前两年我在一些博客网站三天两头就能看到这个标题,虽然今年好像换话题了,但感觉前端每年都要死个七八次,当然这里面还是 ...

  9. Ubuntu安装Edge浏览器,好用的浏览器!!

    秉持着简介的原则,我这里把重要的步骤记录下来,减少废话的使用量,大大缩短你们看的时间,好吧.. 步骤 首先,使用以下命令更新您的系统: sudo apt update 然后,使用以下命令安装Micro ...

  10. 《使用Gin框架构建分布式应用》阅读笔记:p393-p437

    <用Gin框架构建分布式应用>学习第17天,p393-p437总结,总45页. 一.技术总结 1.Prometheus Prometheus放在代码里面使用,还是第一次见.在本人实际的工作 ...