首页 > 数据库 >数据库 NULL 值对比运算符(null safe equal)

数据库 NULL 值对比运算符(null safe equal)

时间:2024-10-23 20:46:20浏览次数:7  
标签:NULL DISTINCT safe Server 运算符 SQL Overflow null SELECT

在 SQL 的规定中,NULL 是不等于 NULL 的,所以如果使用类似 SELECT NULL = NULL 这种语句,获取到的会是一个 FALSE。

但是有些时候我们又希望能够匹配到数据库中的 NULL,通常写法是 SELECT NULL IS NULL,但是有没有能够同时兼容 NULL 和非 NULL 的情况呢?

MySQL

MySQL :: MySQL 5.7 Reference Manual :: 12.4.2 Comparison Functions and Operators

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Oracle

Comparing NULLable Values | An Oracle Programmer

Oracle Null Safe Comparison (Spoiler alert: SYS_OP_MAP_NONNULL) | Aykut Akın’s Blog

PostgreSQL

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b

PostgreSQL: Documentation: 9.2: Comparison Operators

PostgreSQL: Re: NULL safe equality operator

SQL Server

SQL Server 没有这种操作符,只能通过控制 ANSI_NULLS 来控制,但是这个只影响列和常量比较,不影响两个列之间的比较,所以还是有缺陷。

Changing the setting of ANSINULLS is not a solution, because it does not affect column-to-column comparisons, only column to variable comparisons. Setting ANSINULLS to off is also non-standard and not granular enough to apply to specific comparisons in a single query.

——Add language and optimizer support for ISO – Customer Feedback for ACE Community Tooling

一种通用的写法:

或者可以写成 (b IS NULL AND b IS NULL) OR (a IS NOT NULL AND b IS NOT NULL AND a = b)

Does SQL Server support IS DISTINCT FROM clause? - Stack Overflow

sql - How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM? - Stack Overflow

= (Equals) (Transact-SQL) - SQL Server | Microsoft Docs

SET ANSI_NULLS (Transact-SQL) - SQL Server | Microsoft Docs

Mimicking null-safe equal to operator in SQL Server - CodeProject

Why does NULL = NULL evaluate to false in SQL server - Stack Overflow

参考资料

  1. Modern SQL: IS DISTINCT FROM — A comparison operator that treats two NULL values as the same
  2. Comparing NULLable Values | An Oracle Programmer

标签:NULL,DISTINCT,safe,Server,运算符,SQL,Overflow,null,SELECT
From: https://blog.csdn.net/tech_craftsman/article/details/143135123

相关文章

  • NullPointerException—配置属性为null
    1.问题描述空指针异常,获取属性配置类AliOssProperties中的endpoint属性时,为空。配置文件中正确配置了相关的属性,并且AliOssProperties上加了@ConfigurationProperties,启动类上通过@EnableConfigurationProperties(AliOssProperties.class)启用了配置属性支持。Errorstarti......
  • P2934 [USACO09JAN] Safe Travel G 题解
    一个用平衡树,不用脑子的写法。(目前没有用平衡树的诶。)题意不经过最短路的最后一条边的最短路,保证最短路唯一。思路看到最短路唯一容易想到建出的最短路DAG其实是最短路树(以\(1\)为根)。那题意转化为求每个节点不经过与父亲的连边,所能到根节点的最短路。容易发现每个点的......
  • Spring Boot 依赖注入为 null 问题
    目录问题省流代码复现TestServiceTestAspectTestController源码分析AbstractAutoProxyCreatorCglibAopProxyEnhancer问题工作中,在负责的模块里使用@DubboService注解注册了一个dubbo接口,给定时任务模块去调用。在自我调试阶段,需要在本地自己验证一下接口的功......
  • mongodb 查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操
    mongodb查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操作符,更新单个/多个文档,删除文档,批量插入,$type操作符,内嵌文档和数组查找修改1.条件查询SQLMQLa=1{a:1}a<>1{a:{$ne:1}}a>1{a:{$gt:1}}a>=1{a:{$gte:1}}a<1{a:{$lt......
  • UNSAFEPORT
    浏览器默认禁用端口ERR_UNSAFE_PORT端口号原因/特殊端口1tcpmux7echo9discard11systat13daytime15netstat17qotd19chargen20ftpdata21ftpaccess22ssh23telnet25smtp37time42name43nicname53doma......
  • 重载运算符、析构函数
    重载运算符、析构函数1.重载运算符2个对象进行==比较,重载==运算符说白了,就是,写一个成员函数,这个成员函数名"operator==",这个成员函数体里边写一些比较逻辑//定义Time&operator=(constTime&tmpobj)//实现Time&Time::operator=(constTime&tmpobj){cout......
  • Python 赋值与运算符和连接符
    a=input("请输入一个数a")b=input("请输入一个数b")a=float(a)          #将数据转换为浮点型b=float(b)          #将数据转换为浮点型c=a+b#定义c=a+bprint("输入的数为c",c)ifa<b:c=belse:c=aprint("......
  • 逗号运算符的定义与使用
    文章目录前言一、定义与语法二、使用场景三、注意事项前言在C语言中,逗号运算符(,)是一种低优先级的二元运算符,用于在一个表达式中依次执行多个操作。它的主要作用是允许在一个表达式中包含多个子表达式,并按照从左到右的顺序依次计算这些子表达式。逗号运算符的结果是......
  • 四,Java运算符详细分类及使用方法介绍
    Java编程基础:全面掌握运算符在Java编程中,运算符是用于执行程序代码运算的符号。它们可以对变量和值执行各种操作,如算术运算、比较、逻辑判断等。本文将详细探讨Java中的各种运算符,包括算术运算符、关系运算符、赋值运算符、逻辑运算符、位运算符和三目运算符,并提供相应的代码示例......
  • 面向对象 加法运算符重载
    ////Createdby徐昌真on2024/10/18.//#include<iostream>usingnamespacestd;//定义一个复数类classComplex{public:Complex():real(0),image(0){}Complex(intreal,intimage){//这是一个传参构造函数用于传入成员变量的值this-......