oracle关联查询报invalidnumber错误的解决方法,
目录
- 出现问题的原因和背景
- 问题复现1
- 新建表A
- 新建表B
- 问题复现2
- 解决方法
出现问题的原因和背景
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错误的资料请关注PHP之友其它相关文章!
您可能感兴趣的文章:- oracle基础教程之多表关联查询
- Oracle数据库升级到19C用户登录报错问题解决办法
- Navicat连接Oracle数据库报错:Oracle library is not loaded的解决方案
- oracle创建用户时报错ORA-65096:公用用户名或角色名无效解决方式
- Oracle客户端连接报错ORA-12545问题的解决办法
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。