当前位置: 首页 > news >正文

PostgreSQL 中,若需显示 不在 `IN` 子句列表中的数据

在 PostgreSQL 中,若需显示 不在 IN 子句列表中的数据,可以通过以下方法实现:


方法 1:使用 NOT IN(注意 NULL 值)

直接筛选不包含在 IN 列表中的记录:

SELECT *
FROM your_table
WHERE your_column NOT IN (value1, value2, ...);

注意:若列表或列中存在 NULLNOT IN 可能返回意外结果。此时建议改用 NOT EXISTSLEFT JOIN


方法 2:使用 LEFT JOIN 结合临时表

IN 列表转换为临时表,并通过左连接找出缺失项:

WITH values_list (value) AS (VALUES (value1), (value2), (value3)  -- 替换为你的具体值
)
SELECT vl.value AS missing_value
FROM values_list vl
LEFT JOIN your_table yt ON vl.value = yt.your_column
WHERE yt.your_column IS NULL;

效果:显示所有在列表中但不在表中的值。


方法 3:使用 EXCEPT 集合操作符

直接对比两个集合的差集:

(SELECT value FROM (VALUES (value1), (value2), ...) AS t(value))  -- 替换为你的列表
EXCEPT
SELECT your_column FROM your_table);

结果:返回列表中存在但表中不存在的值。


方法 4:动态生成完整列表并标记存在状态

若需同时显示存在与不存在的数据,并标记状态:

WITH desired_values (value) AS (VALUES (value1), (value2), (value3)  -- 你的目标值列表
)
SELECT dv.value,CASE WHEN yt.your_column IS NULL THEN '不存在' ELSE '存在' END AS status
FROM desired_values dv
LEFT JOIN your_table yt ON dv.value = yt.your_column;

输出:每个值附带状态,清晰展示是否存在于表中。


示例场景

假设表 products 中有 product_id,想检查 (101, 102, 103) 是否存在:

WITH check_ids (id) AS (VALUES (101), (102), (103)
)
SELECT ci.id AS target_id,p.product_name,CASE WHEN p.product_id IS NULL THEN '缺失' ELSE '存在' END AS status
FROM check_ids ci
LEFT JOIN products p ON ci.id = p.product_id;

结果:列出每个目标 ID 及其存在状态。


关键点

  • 处理 NULL:当列或列表含 NULL 时,优先使用 LEFT JOINNOT EXISTS 避免逻辑错误。
  • 灵活转换列表:通过 VALUES 或临时表将硬编码列表转换为可连接的数据源。
  • 明确需求:根据是否需要“反向筛选”或“完整对比”选择合适方法。

根据具体场景选择最适合的方案,确保数据对比的准确性和效率。

http://www.lqws.cn/news/556633.html

相关文章:

  • SQL常用命令
  • 阿里云Ubuntu服务器上安装MySQL并配置远程连接
  • 网络缓冲区
  • Solidity学习 - 错误处理
  • ffpaly播放 g711a音频命令
  • 【学习笔记】深入理解Java虚拟机学习笔记——第12章 Java内存模型与线程
  • 设计模式之抽象工厂模式
  • Docker 入门教程(五):Docker 命令思维导图
  • 【分布式机架感知】分布式机架感知能力的主流存储系统与数据库软件
  • 微处理原理与应用篇---STM32寄存器控制GPIO
  • 矩阵的条件数(Condition Number of a Matrix)
  • 华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio安装NoteGen AI笔记应用程序
  • Learning PostgresSQL读书笔记: 第11章 Transactions, MVCC, WALs, and Checkpoints
  • 基于Docker的mosquitto安装测试
  • FPGA设计的上板调试
  • python多线程详细讲解
  • Python爬虫实战:研究difflib库相关技术
  • Ubuntu 主机通过 `enp4s0` 向开发板共享网络的完整步骤
  • 默克树技术原理
  • 组成原理--指令指令集寻址方式的介绍
  • ubuntu-server 与 ubuntu-live-server 的区别 笔记250628
  • Java锁机制知识点
  • 网关ARP防护的措施
  • 【开源初探】基于Qwen2.5VL的OCRFlux
  • vue-28(服务器端渲染(SSR)简介及其优势)
  • LNA设计
  • macOS生成密钥对教程
  • 网络攻防技术
  • WOE值:风险建模中的“证据权重”量化术——从似然比理论到FICO评分卡实践
  • 最后的生还者2:重制版 免安 中文离线运行版+整合包