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

news/2024/10/3 22:15:25/

出现问题的原因和背景

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/news/1533606.html

相关文章

职场人情世故

1.人走茶凉本是常态,朋友是流动的,人是会变的,走的人不必挽留。 2.别人不问你的事,千万不要随意去指点别人,因为你不知道某些事的复杂程度。 3.不要太在乎面子,不管别人如何对你指指点点,你都…

足球青训俱乐部管理:Spring Boot技术驱动

摘 要 随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率…

基于单片机人体反应速度测试仪系统

** 文章目录 前言概要设计思路 软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…

Android Webview和ScrollView冲突和WebView使用总结

1.因为Webview和ScrollView都用滑动事件,导致webview很难被滑动,即使被滑动了一点也非常不顺畅2.解决滑动冲突问题后发现,如果webview嵌套的html中含有轮播图等还是有问题。 使用自定义ScrollWebView解决这个问题 public class ScrollWebVi…

初识算法 · 双指针(2)

目录 前言: 盛最多水的容器 题目解析: 算法原理: 算法编写: 有效三角形的个数 题目解析: 算法原理: 算法编写: 前言: 本文介绍两个题目,盛最多水的容器和有效三…

【Spring】深入理解控制反转-IOC

目录 一、Spring_ioc_01项目 1. jdbc.properties 2. 高耦合 3. 中耦合 4. 低耦合 二、Spring_ioc_02项目 1. xxx.properties(键值对存储) 2. 解耦的方式创建对象 3. 调用getBean()方法并传入xxx.properties对应键获取其相应的值 三、Spring_ioc_03项目 1. spring两大…

taro RN 左右滑动切换页面

引入 react-native-pager-view 组件 import React, { Component } from react import Taro from tarojs/taro import { View, PagerView, Button } from tarojs/components import PagerView from react-native-pager-view;export default class MyComponent extends Taro.C…

Linux下send函数和recv函数

1. 基本介绍 send 函数 send 函数用于向一个已连接的套接字发送数据。它的典型使用场景是在TCP通信中,客户端和服务器之间交换数据。 函数声明: ssize_t send(int sockfd, const void *buf, size_t len, int flags); 参数解释: sockfd&a…