oracle關(guān)聯(lián)查詢報(bào)invalid number錯(cuò)誤的解決方法
出現(xiàn)問題的原因和背景
oracle進(jìn)行關(guān)聯(lián)查詢的時(shí)候因?yàn)樽侄?strong>存在多個(gè)用逗號(hào)切割的id,導(dǎo)致查詢的過程中報(bào)無效數(shù)字或非法數(shù)字
問題復(fù)現(xiàn)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');
問題復(fù)現(xiàn)2
select * from A where id in (select aid from B where id = 3)
產(chǎn)生的原因:因?yàn)椴樵冞^程中,多個(gè)id放在了一個(gè)字段,這個(gè)字段不止有數(shù)字也有逗號(hào),id是數(shù)字類型,所以數(shù)據(jù)庫(kù)識(shí)別以后直接會(huì)報(bào)非法數(shù)字。
解決方法
先將子查詢轉(zhuǎn)成多行
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表數(shù)據(jù)
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表的名稱轉(zhuǎn)成一行
select LISTAGG(name,',') WITHIN GROUP (ORDER BY name) 關(guān)聯(lián)流程 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關(guān)聯(lián)查詢報(bào)invalid number錯(cuò)誤的解決方法的詳細(xì)內(nèi)容,更多關(guān)于oracle報(bào)invalid number錯(cuò)誤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
修改Oracle監(jiān)聽默認(rèn)端口號(hào)1521的方法
我們都知道,Oracle的監(jiān)聽默認(rèn)端口是1521,但是如果系統(tǒng)上1521已經(jīng)被占用或業(yè)務(wù)要求不用默認(rèn)端口,又或者是為了安全,這個(gè)時(shí)候我們就需要修改監(jiān)聽的默認(rèn)端口。下面這篇文章主要介紹了修改Oracle監(jiān)聽默認(rèn)端口號(hào)1521的方法,需要的朋友可以參考下。2017-01-01詳解PL/SQL Developer連接本地Oracle 11g 64位數(shù)據(jù)庫(kù)
本篇文章主要介紹了PL/SQL Developer連接本地Oracle 11g 64位數(shù)據(jù)庫(kù) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Oracle 細(xì)粒度審計(jì)(FGA)初步認(rèn)識(shí)
細(xì)粒度審計(jì)(FGA),是在Oracle 9i中引入的,能夠記錄SCN號(hào)和行級(jí)的更改以重建舊的數(shù)據(jù),本文將詳細(xì)介紹,需要的朋友可以參考下2012-12-12Oracle往某表批量插入記錄的幾種實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Oracle往某表批量插入記錄的幾種實(shí)現(xiàn)方法,Oracle批量插入語(yǔ)句與其他數(shù)據(jù)庫(kù)不同,文中通過代碼實(shí)例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Oracle進(jìn)行數(shù)據(jù)庫(kù)升級(jí)和降級(jí)的操作代碼
數(shù)據(jù)庫(kù)升級(jí)是一個(gè)復(fù)雜的過程,涉及到備份現(xiàn)有數(shù)據(jù)、安裝新版本的數(shù)據(jù)庫(kù)軟件、遷移數(shù)據(jù)和應(yīng)用程序的兼容性測(cè)試等步驟,數(shù)據(jù)庫(kù)降級(jí)通常比升級(jí)更具挑戰(zhàn)性,所以本文給大家介紹了Oracle進(jìn)行數(shù)據(jù)庫(kù)升級(jí)和降級(jí)的操作,需要的朋友可以參考下2024-09-09oracle數(shù)據(jù)庫(kù)截取字符串substr函數(shù)使用舉例
在Oracle數(shù)據(jù)庫(kù)中可以使用SUBSTR函數(shù)來截取字符串,這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫(kù)截取字符串substr函數(shù)使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01ORACLE 數(shù)據(jù)庫(kù)RMAN備份恢復(fù)
還原不同位置的數(shù)據(jù)庫(kù)2009-04-04Oracle?11g+windows?環(huán)境下Ecology7系統(tǒng)安裝過程
這篇文章主要介紹了Oracle?11g+windows?環(huán)境下Ecology7系統(tǒng)安裝,安裝步驟是以管理員模式運(yùn)行Oracle setup.exe文件,根據(jù)提示安裝Oracle,創(chuàng)建數(shù)據(jù)庫(kù),注意修改連接數(shù),本文給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10