IT俱乐部 Oracle oracle关联查询报invalid number错误的解决方法

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

出现问题的原因和背景

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

问题复现1

新建表A

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
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

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

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

解决方法

先将子查询转成多行

1
2
3
4
5
6
7
8
9
10
    WITH
    split_string AS (
                SELECT   (select aid from 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表数据

1
2
3
4
5
6
7
8
9
10
select * from where id  in (    WITH
    split_string AS (
                SELECT   (select aid from 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表的名称转成一行

1
2
3
4
5
6
7
8
9
10
select LISTAGG(name,',') WITHIN GROUP (ORDER BY name) 关联流程 from A where  id in (    WITH
    split_string AS (
        SELECT   (select aid from 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错误的资料请关注IT俱乐部其它相关文章!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/database/oracle/14953.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部