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