SparkSQL 子查询 IN/NOT IN 对 NULL 值的处理

SparkSQL 子查询 IN/NOT IN 对 NULL 值的处理

官网:https://spark.apache.org/docs/4.0.0/sql-ref-functions.html

https://spark.apache.org/docs/4.0.0/sql-ref-null-semantics.html#innot-in-subquery

在这里插入图片描述

Unlike the EXISTS expression, IN expression can return a TRUE, FALSE or UNKNOWN (NULL) value.
EXISTS 不同,IN 表达式可能返回三种布尔状态:

  • TRUE:当前值在集合中;
  • FALSE:当前值不在集合中;
  • UNKNOWN(即 NULL):当表达式中涉及了 NULL 值时,无法确定真假。

Conceptually a IN expression is semantically equivalent to a set of equality condition separated by a disjunctive operator (OR).For example, c1 IN (1, 2, 3) is semantically equivalent to (c1 = 1 OR c1 = 2 OR c1 = 3).

从语义上讲,IN 表达式等价于多个等于条件用 OR 连接起来。

c1 IN (1, 2, 3)

相当于:

c1 = 1 OR c1 = 2 OR c1 = 3

As far as handling NULL values are concerned, the semantics can be deduced from the NULL value handling in comparison operators(=) and logical operators(OR).

对于 NULL 值的处理方式,可以基于比较运算符(如 =)和逻辑运算符(如 OR)的行为来推导。 也就是说,IN 的行为是建立在底层 SQL 对 NULL 处理规则之上的。


To summarize, below are the rules for computing the result of an IN expression.

  • TRUE is returned when the non-NULL value in question is found in the list
  • FALSE is returned when the non-NULL value is not found in the list and the list does not contain NULL values
  • UNKNOWN is returned when the value is NULL, or the non-NULL value is not found in the list and the list contains at least one NULL value

IN 表达式的计算规则如下:

情况结果
当前值不为 NULL,并且存在于列表中TRUE
当前值不为 NULL,但不在列表中,且列表中没有 NULL值FALSE
当前值为 NULL,或者列表中有 NULL值但当前值不在其中UNKNOWN

只要列表中包含 NULL,即使当前值不在列表中,也不能简单地返回 FALSE,而是返回 UNKNOWN


IN Demo:


1:子查询结果只有 NULL

%sql
WITH person AS (SELECT * FROM VALUES('a', 25),('b', 30),('c', 35),('d', 40),('e', 50),('d', 50)AS person(name, age)
)
SELECT * FROM person
WHERE age IN (SELECT null);

空表✅

在这里插入图片描述

  • IN (NULL) 返回的是 UNKNOWN,不会匹配任何行。

2:子查询包含 NULL 和有效值

%sql
WITH person AS (SELECT * FROM VALUES('a', 25),('b', 30),('c', 35),('d', 40),('e', 50),('f', 50)AS person(name, age)
)
SELECT * FROM person
WHERE age IN (SELECT age FROM VALUES(50), (NULL)AS sub(age)
);
-- 虽然子查询里有 NULL,但只要匹配到具体值就会返回;

只有 age = 50 的记录被选中。

在这里插入图片描述


3:子查询包含 NULL 和多个值

%sql
WITH person AS (SELECT * FROM VALUES('a', 25),('b', 30),('c', 35),('d', 40),('e', 50),('f', 50)AS person(name, age)
)
SELECT * FROM person
WHERE age IN (SELECT age FROM VALUES(25), (30), (NULL)AS sub(age)
);
-- 虽然子查询里有 NULL,但只要匹配到具体值就会返回;

在这里插入图片描述


4: 主表中存在 NULL 值,同时子查询结果也包含 NULL

在这里插入图片描述

条件是否被选中原因
age = 25✅ 是匹配列表中的值
age = NULL❌ 否NULL IN (…) → UNKNOWN
age = 35/40/50❌ 否不匹配列表中的非 NULL 值,且列表中有 NULL → UNKNOWN

NOT IN Demo:

只要 NOT IN 后面的子查询包含 NULL,整个条件就会变成 UNKNOWN没有任何行被返回

避免这个问题,需要在子查询中加上 WHERE age IS NOT NULL

1:子查询结果只有 NULL

  • NOT IN (只要有null)不返回任何结果
%sql
WITH person AS (SELECT * FROM VALUES('a', 25),('b', 30),('c', 35),('d', 40),('e', 50),('d', 50)AS person(name, age)
)
SELECT * FROM person
WHERE age NOT IN (SELECT null);

在这里插入图片描述

子查询中包含 NULLNOT IN 整体返回 UNKNOWN,SQL 不会将其视为 TRUE,所以没有行满足条件。


2: 子查询包含 NULL 和有效值

  • NOT IN (只要有null)不返回任何结果
%sql
WITH person AS (SELECT * FROM VALUES('a', 25),('b', 30),('c', 35),('d', 40),('e', 50),('f', 50)AS person(name, age)
)
SELECT * FROM person
WHERE age NOT IN (SELECT age FROM VALUES(50), (NULL)AS sub(age)
);

在这里插入图片描述


3: 主表中存在 NULL 值,同时子查询结果也包含 NULL

  • NOT IN (只要有null)不返回任何结果
%sql
WITH person AS (SELECT * FROM VALUES('a', 25),('b', 30),('c', null),('d', 40),('e', 50),('f', 50)AS person(name, age)
)
SELECT * FROM person
WHERE age NOT IN (SELECT age FROM VALUES(50), (NULL)AS sub(age)
);

在这里插入图片描述


Spark官方对于各种函数处理null值的说明:

https://spark.apache.org/docs/4.0.0/sql-ref-null-semantics.html

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90393.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安卓笔记】lifecycle与viewModel

0. 环境: 电脑:Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version:8.11.1 Compile Sdk Version:35 Java 版本:Java11 1. 本篇文章涉及到的内容 lifecycle livedata databinding viewModel 2. …

84、逆向工程开发方法

逆向工程开发方法是一种通过分析现有产品、系统或代码来理解其设计原理、功能实现及潜在缺陷,并在此基础上进行改进、复制或创新的技术过程。它广泛应用于软件、硬件、机械、电子等多个领域,尤其在缺乏原始设计文档或需要快速掌握复杂系统时具有显著优势…

ospf单区域实验

拓扑图:AR1:[Huawei]ospf 1 router-id 1.1.1.1 [Huawei-ospf-1]area 0[Huawei-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255(1.当前网段会被ospf的进程1学习到然后通告出去;2.如果接口的IP地址处于这个网段中&#xff0c…

Linux命令基础完结篇

用户权限修改 chmod修改文件权限 文字设定法 u:所有者g:所属组o:其他人a:所有:添加权限-:删除权限:赋予权限数字设定法 r:4w:2x:1每一组权限:0~7举…

高效互联,ModbusTCP转EtherCAT网关赋能新能源电缆智能制造

在新能源汽车快速发展的背景下,新能源电缆作为关键组件,需满足耐高低温、阻燃、耐老化等严苛要求,这对生产线的工艺与设备提出了更高标准。为提升制造效率,某领先设备制造商创新采用**ModbusTCP转EtherCAT网关**技术,实…

Java_多线程_生产者消费者模型_互斥锁,阻塞队列

生产者消费者模型(Producer-Consumer Model)是计算机科学中一个经典的并发编程模型,用于解决多线程/多进程环境下的协作问题。 基本概念 生产者:负责生成数据或任务的实体 消费者:负责处理数据或执行任务的实体 缓冲区:生产者与消…

Vue3实现视频播放弹窗组件,支持全屏播放,音量控制,进度条自定义样式,适配浏览器小窗播放,视频大小自适配,缓冲loading,代码复制即用

效果图组件所需VUE3代码<template><div class"video-dialog" :class"fullScreen && video-dialog-full-screen"><el-dialogv-model"props.visible"draggable:show-close"false"title""centeralign-c…

LLM层归一化:γβ与均值方差的协同奥秘

LLM层归一化参数均值和方差;缩放和平移参数是什么 层归一化(Layer Normalization,LN)是深度学习中用于稳定神经网络训练的一种归一化技术 均值和方差参数用于对输入数据进行标准化处理,即将输入数据转换为均值为0、方差为1的标准正态分布 缩放因子γ\gammaγ:标准化后…

智慧场景:定制开发开源AI智能名片S2B2C商城小程序赋能零售新体验

摘要&#xff1a;智慧场景作为零售行业创新发展的关键载体&#xff0c;正深刻改变着消费者的生活方式。本文聚焦智慧零售模式下智慧场景的构建&#xff0c;以定制开发开源AI智能名片S2B2C商城小程序为切入点&#xff0c;深入探讨其在零售企业选址布局、商业模式创新、经营理念转…

QML WorkerScript

WorkerScript是QML中实现多线程编程的关键组件&#xff0c;它允许开发者将耗时操作移至后台线程执行&#xff0c;避免阻塞主UI线程&#xff0c;从而提升应用响应速度和用户体验。本文将全面介绍WorkerScript的核心机制、使用方法和最佳实践。WorkerScript核心机制WorkerScript通…

锐浪报表 Grid++Report 表头表尾的隐藏

设计锐浪表格的模板时&#xff0c;可以通过设计多个表头、表尾&#xff0c;表头、表尾中放入打印控件&#xff0c;可以打印相关的数据。在真实打印时&#xff0c;可以通过打印时让表头、表尾隐藏或显示&#xff0c;实现用户的表格样式。一、表头的指定1、 表头可以多个&#xf…

低速信号设计之 QSPI 篇

一、引言​ 在服务器技术不断演进的当下,对高效、稳定的数据存储和传输需求日益增长。QSPI(Quad Serial Peripheral Interface)总线作为一种高速、串行的外围设备接口,在服务器领域中发挥着关键作用。它为服务器中的各类存储设备及部分外围芯片与主处理器之间提供了快速可…

别只知道暴力循环!我从用户名校验功能中领悟到的高效字符集判断法(1684. 统计一致字符串的数目)

别只知道暴力循环&#xff01;我从用户名校验功能中领悟到的高效字符集判断法 &#x1f60e; 大家好&#xff0c;日常开发中&#xff0c;我们经常会遇到一些看似不起眼&#xff0c;却能成为性能瓶颈的小模块。今天&#xff0c;我想和大家分享一个我亲身经历的故事&#xff0c;…

力扣面试150题--在排序数组中查找元素的第一个和最后一个位置

Day 85 题目描述思路 当 nums[mid] < target 时&#xff0c;说明目标值在右侧&#xff0c;移动左指针 left mid 1 当 nums[mid] > target 时&#xff0c;说明目标值可能在当前位置或左侧&#xff0c;移动右指针 right mid - 1 循环结束后&#xff0c;left 指针会指向第…

C++实战:人脸识别7大核心实例

计算机视觉实例应用 基于C++的人脸识别实例 以下是一些基于C++的人脸识别实例的示例和实现方法,涵盖了多种技术和库的应用。这些例子可以帮助开发者快速上手并实现人脸识别功能。 OpenCV 基础人脸检测 使用OpenCV的预训练模型进行人脸检测是入门级示例。OpenCV自带Haar级联…

Uniapp中使用vue3语法

在setup语法糖中调用uniapp的页面生命周期 <script setup>import { onShow } from "dcloudio/uni-app"onShow(() > {//hanlder...}) </script>vue2混入在vue3中建议使用组合式API 新建baseHook.js import { ref } from "vue"; export fu…

C++vector(2)

2.vector深度剖析及模拟实现 2.1std::vector的核心框架接口的模拟实现bit::vector vector的模拟实现 2.2 使用memcpy拷贝问题 假设模拟实现的vector中的reserve接口中&#xff0c;使用memcpy进行的拷贝&#xff0c;以下代码会发生什么问题&#xff1f; int main() {gxl::ve…

IPSec VPN -- 野蛮模式

一、野蛮模式简介野蛮模式VPN是指IPsec VPN中IKE协商采用野蛮模式&#xff08;Aggressive Mode&#xff09;的虚拟专用网络。它是IKE第一阶段协商的一种方式&#xff0c;与主模式相对&#xff0c;具有协商速度快但安全性稍低的特点。以下是具体介绍&#xff1a;1、工作原理&…

rk3588开发板使用硬件编码处理视频

开发板默认下载的ffmpeg是通用版&#xff0c;无法调用rk3588的硬件编码器&#xff0c;视频编码效率低。 nyanmisaka开发了用于jellyfin的ffmpeg&#xff0c;支持rk3588硬件编码器&#xff0c;编译方法&#xff1a; https://github.com/nyanmisaka/ffmpeg-rockchip/wiki/Compil…

`neutron router-gateway-set` 操作失败的可能原因及解决方案

根据提供的错误信息和搜索结果&#xff0c;neutron router-gateway-set 操作失败的可能原因及解决方案如下&#xff1a;一、常见错误原因数据库字符集配置问题&#xff08;中文名支持&#xff09; 表现&#xff1a;若路由器名称包含中文字符&#xff0c;可能因数据库字符集非UT…