oracle解决关联查询报invalid number问题

ops/2024/10/18 10:33:12/

出现问题的原因和背景

oracle进行关联查询的时候因为字段存在多个用逗号切割的id,导致查询的过程中报无效数字或非法数字

问题复现

新建表A

CREATE TABLE  "A" (id NUMBER NOT NULL,name VARCHAR2(255 BYTE)
)INSERT INTO "A" VALUES ('1', '上海');
INSERT INTO "A" VALUES ('2', '北京');
INSERT INTO "A" VALUES ('3', '广州');
INSERT INTO "A" VALUES ('4', '深圳');

新建表B


CREATE TABLE  "B" (id NUMBER NOT NULL,aid VARCHAR2(255 BYTE)
)INSERT INTO "B" VALUES ('1', '1,2,3');
INSERT INTO "B" VALUES ('2', '1,2');
INSERT INTO "B" VALUES ('3', '1,2,3,4');

问题复现

select * from A  where id  in (select aid from B  where id = 3)

产生的原因:因为查询过程中,多个id放在了一个字段,这个字段不止有数字也有逗号,id是数字类型,所以数据库识别以后直接会报非法数字。

解决方法

先将子查询转成多行

	WITH split_string AS (SELECT   (select aid from B  where id = 3)AS string FROM dual)
SELECT REGEXP_SUBSTR(string, '[^,]+', 1, LEVEL) AS aid
FROM split_string
CONNECT BYREGEXP_SUBSTR(string, '[^,]+', 1, LEVEL) IS NOT NULL;

再次查询A表数据


select * from A  where id  in (	WITH split_string AS (SELECT   (select aid from B  where id = 3)AS string FROM dual)
SELECT REGEXP_SUBSTR(string, '[^,]+', 1, LEVEL) AS aid
FROM split_string
CONNECT BYREGEXP_SUBSTR(string, '[^,]+', 1, LEVEL) IS NOT NULL)

将A表的名称转成一行

select LISTAGG(name,',') WITHIN GROUP (ORDER BY name) 关联流程 from A where  id in (	WITH split_string AS (SELECT   (select aid from B  where id = 3)AS string FROM dual)
SELECT REGEXP_SUBSTR(string, '[^,]+', 1, LEVEL) AS split_value
FROM split_string
CONNECT BYREGEXP_SUBSTR(string, '[^,]+', 1, LEVEL) IS NOT NULL) 


http://www.ppmy.cn/ops/122463.html

相关文章

CGLib动态代理和JDK动态代理Demo、ASM技术尝鲜

本文主要介绍CGLib和JDK动态代理的使用,不对源码进行深入分析。代码可直接复制使用。 类型 机制 回调方式 适用场景 效率 JDK动态代理 委托机制。代理类和目标类都实现了同样的接口。InvocationHandler持有目标类。代理类委托InvocationHandler去调用目标类原…

VGG16模型实现MNIST图像分类

MNIST图像数据集 MNIST(Modified National Institute of Standards and Technology)是一个经典的机器学习数据集,常用于训练和测试图像处理和机器学习算法,特别是在数字识别领域。该数据集包含了大约 7 万张手写数字图片&#xf…

k8s搭建双主的mysql8集群---无坑

《k8s搭建一主三从的mysql8集群---无坑-CSDN博客》通过搭建一主三从,我们能理解到主节点只有1个,那么承担增删改主要还是主节点,如果你在从节点上去操作增删改操作,数据不会同步到其他节点。本章我们将实现多主(双主&a…

【艾思科蓝】Vue.js组件开发实战:从零构建高效可复用组件

【IEEE出版 | 会后3-4个月EI检索】第三届云计算、大数据应用与软件工程国际学术会议 (CBASE 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看:学术会议-学术交流征稿-学术会议在线-艾思科蓝 目录 引言 一、Vue.js 组件开发基础 二、构建高效可…

一个简单的将产品图册转换为翻页电子产品图册的方法

​在数字化浪潮席卷全球的今天,企业纷纷寻求转型,纸质产品图册逐渐被翻页电子图册所替代。电子图册不仅具有环保、便捷、易于更新等优势,还能为企业节省大量印刷和物流成本。那么,如何将现有的实体产品图册转化为翻页电子图册呢 1…

1、如何查看电脑已经连接上的wifi的密码?

在电脑桌面右下角的如下位置:双击打开查看当前连接上的wifi的名字:ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后,按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后,按一下回车&…

cmake如何在编译时区分-std=c++17和-std=gnu++17?检查宏

如何在编译时区分-stdc17和-stdgnu17&#xff1f;检查宏&#xff1f;-腾讯云开发者社区-腾讯云 我正在使用__int128扩展的g。-stdc17的问题是&#xff0c;一些C库不具备对该扩展的全部支持(即std::make_unsigned<>失败)。当使用-stdgnu17时&#xff0c;它工作得很好。 我…

磁盘存储、B树、B+树

文章目录 一、磁盘结构分析与数据存储原理二、B树和B树1.B树的定义2.B树与B树的区别 一、磁盘结构分析与数据存储原理 我们知道常见的数据结构有链表&#xff0c;树&#xff0c;图等等&#xff0c;而树又可以分为二叉树&#xff0c;多叉树等等。对于链表来说&#xff0c;它可以…