oracle关联查询报invalid number错误的解决方法

 更新时间:2024年09月30日 10:21:30   作者:java-zh  
这篇文章主要介绍了oracle关联查询报invalid number错误的解决方法,文中通过代码示例和图文结合的方式讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

出现问题的原因和背景

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

问题复现1

新建表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');

问题复现2

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 BY
    REGEXP_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 BY
    REGEXP_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 BY
    REGEXP_SUBSTR(string, '[^,]+', 1, LEVEL) IS NOT NULL) 

以上就是oracle关联查询报invalid number错误的解决方法的详细内容,更多关于oracle报invalid number错误的资料请关注脚本之家其它相关文章!

相关文章

  • Oracle中查看表空间使用率的SQL脚本分享

    Oracle中查看表空间使用率的SQL脚本分享

    这篇文章主要介绍了Oracle中查看表空间使用率的SQL脚本分享,本文直接给出脚本代码和运行效果图,需要的朋友可以参考下
    2014-10-10
  • oracle 彻底删除方法

    oracle 彻底删除方法

    如果有个别DLL文件无法删除的情况,则不用理会,重新启动,开始新的安装,安装时,选择一个新的目录,则,安装完毕并重新启动后,老的目录及文件就可以删除掉了。
    2009-06-06
  • oracle中如何获得数据库的DBID信息

    oracle中如何获得数据库的DBID信息

    在进行数据库恢复的过程中,很多时候我们需要知道Oracle数据库的DBID,通常有以下几种方法可以获得数据库的DBID
    2013-09-09
  • 利用函数返回oracle对象表的三种方法

    利用函数返回oracle对象表的三种方法

    这篇文章主要为大家详细介绍了利用函数返回oracle对象表的三种方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Linux 自动备份oracle数据库详解

    Linux 自动备份oracle数据库详解

    这篇文章主要介绍了Linux 自动备份oracle数据库详解方法的相关资料,数据库的备份的重要性,不言而喻,希望能帮到大家,需要的朋友可以参考下
    2016-10-10
  • Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序

    这篇文章主要介绍了Oracle用decode函数或CASE-WHEN实现自定义排序功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Oracle设置DB、监听和EM开机启动的方法

    Oracle设置DB、监听和EM开机启动的方法

    这篇文章主要介绍了Oracle设置DB、监听和EM开机启动的方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Oracle 11GR2的递归WITH子查询方法

    Oracle 11GR2的递归WITH子查询方法

    这篇文章主要介绍了Oracle 11GR2的递归WITH子查询方法,非常不错,具有参考借鉴价值,朋友可以参考下
    2017-02-02
  • Oracle以逗号分隔的字符串拆分为多行数据实例详解

    Oracle以逗号分隔的字符串拆分为多行数据实例详解

    做多选功能时为了简便,会在某个字段中存储多个值,保存时虽然省事,但后续的查询统计时还需要拆分数据才行,因此这时需要将字段内的值分成多行以便后续使用,这篇文章主要给大家介绍了关于Oracle以逗号分隔的字符串拆分为多行数据的相关资料,需要的朋友可以参考下
    2021-07-07
  • 使用Oracle命令进行数据库备份与还原

    使用Oracle命令进行数据库备份与还原

    本文详细讲解了使用Oracle命令进行数据库备份与还原的方法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2021-12-12

最新评论