oracle關(guān)聯(lián)查詢報(bào)invalid number錯(cuò)誤的解決方法
出現(xiàn)問(wèn)題的原因和背景
oracle進(jìn)行關(guān)聯(lián)查詢的時(shí)候因?yàn)樽侄?strong>存在多個(gè)用逗號(hào)切割的id,導(dǎo)致查詢的過(guò)程中報(bào)無(wú)效數(shù)字或非法數(shù)字
問(wèn)題復(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');問(wèn)題復(fù)現(xiàn)2
select * from A where id in (select aid from B where id = 3)

產(chǎn)生的原因:因?yàn)椴樵冞^(guò)程中,多個(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)文章!
- Oracle 中 row_number()、rank()、dense_rank() 函數(shù)的用法詳解
- Oracle中ROW_NUMBER()OVER()函數(shù)用法實(shí)例講解
- Oracle數(shù)字類型number自增的實(shí)現(xiàn)代碼
- Oracle數(shù)據(jù)庫(kù)rownum和row_number的不同點(diǎn)
- oracle中rownum和row_number()
- Oracle Number型數(shù)值存儲(chǔ)與轉(zhuǎn)換的實(shí)現(xiàn)詳解
- Oracle Number型的深入理解
- Oracle中TO_NUMBER()函數(shù)的使用
相關(guān)文章
基于Oracle的面向?qū)ο蠹夹g(shù)入門基礎(chǔ)簡(jiǎn)析開發(fā)者網(wǎng)絡(luò)Oracle
基于Oracle的面向?qū)ο蠹夹g(shù)入門基礎(chǔ)簡(jiǎn)析開發(fā)者網(wǎng)絡(luò)Oracle...2007-03-03
Oracle數(shù)據(jù)庫(kù)中的優(yōu)化方法
這篇文章主要給大家介紹了Oracle數(shù)據(jù)庫(kù)中的優(yōu)化方法,Oracle數(shù)據(jù)庫(kù)是當(dāng)前應(yīng)用最廣泛的大型數(shù)據(jù)庫(kù)之一,其系統(tǒng)結(jié)構(gòu)復(fù)雜,性能受多方面因素影響,其中查詢操作是影響其性能的關(guān)鍵因素,需要的朋友可以參考下2023-07-07
oracle查看執(zhí)行最慢與查詢次數(shù)最多的sql語(yǔ)句
這篇文章主要給大家介紹了oracle查看執(zhí)行最慢與查詢次數(shù)最多的sql語(yǔ)句,文中給出完整的示例代碼,相信對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-01-01
oracle設(shè)置密碼復(fù)雜度及設(shè)置超時(shí)退出的功能
我們都知道密碼策略加固的參數(shù)一般包括密碼長(zhǎng)度、復(fù)雜度檢測(cè)、最大最小使用時(shí)間、過(guò)期警報(bào)時(shí)間、最大登錄失敗次數(shù)以及鎖定時(shí)間等設(shè)置,下面這篇文章主要給大家介紹了關(guān)于oracle設(shè)置密碼復(fù)雜度及設(shè)置超時(shí)退出功能的相關(guān)資料,需要的朋友可以參考下2022-06-06
Oracle Linux 6.8安裝 mysql 5.7.17的詳細(xì)教程
這篇文章主要介紹了Oracle Linux 6.8安裝 mysql 5.7.17的詳細(xì)教程,需要的朋友可以參考下2017-06-06
Oracle 管道 解決Exp/Imp大量數(shù)據(jù)處理問(wèn)題
Oracle的exp/imp是許多用戶經(jīng)常使用的兩個(gè)工具. 它們常被用來(lái)做數(shù)據(jù)庫(kù)的邏輯備份,數(shù)據(jù)庫(kù)重組和數(shù)據(jù)轉(zhuǎn)移等工作.2009-07-07
Oracle阻塞(blockingblocked)實(shí)例詳解
這篇文章主要介紹了Oracle阻塞(blockingblocked),需要的朋友可以參考下2014-07-07
oracle net manager 數(shù)據(jù)傳輸安全步驟詳解
oracle net manager來(lái)加密客戶端與數(shù)據(jù)庫(kù)之間或中間件與 數(shù)據(jù)庫(kù)之間的網(wǎng)絡(luò)傳輸數(shù)據(jù)。這篇文章主要介紹了oracle net manager 數(shù)據(jù)傳輸安全 ,需要的朋友可以參考下2018-09-09

