Oracle in 引數個數超過1000的解決方案

2021-08-19 17:32:10 字數 1737 閱讀 4855

在網上搜了一下,解決方案都是將引數分段,即select * from table where id in (1, 2, ..., 1000) or id in(1001, ....., 1999)。

但是這種方式感覺效率太低,當引數特別多的時候可能非常慢。

但是這種方案是標準sql,sql拼起來也不算複雜,目前專案中就用的這種方案,畢竟引數不會特別長。

第一種:起初最先想到的解決方案是分多次查,然後在程式中將結果集累加。

第二種:也可以在資料庫中累加,用union,拼sql。

第三種:就是開始提到的用 or的方法 or in or in ......

第四種:直接看sql,in裡邊用union all (這種方法可以,那麼......)

select *

from table

where id in (

select 1 from dual

union all

select 2 from dual

……)

第五種:受第四種方案的啟發,能不能不用這種union all的方式,用乙個種更簡潔的寫法呢,也許oracle有某個函式可以將一行轉成多行呢。從來都是只有想不到沒有做不到。強大的oracle果然提供了這樣的函式。「regexp_substr」

regexp_substr函式格式如下:

function regexp_substr(string, pattern, position, occurrence, modifier)

__srcstr     :需要進行正則處理的字串

__pattern    :進行匹配的正規表示式

__position   :起始位置,從第幾個字元開始正規表示式匹配(預設為1)

__occurrence :標識第幾個匹配組,預設為1

__modifier   :模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。預設為'c'。)

舉個例子:

select regexp_substr('17,20,23','[^,]+',1,1,'i') as str from dual
執行結果:17

好像很接近了,但是只有一行怎麼變成多行呢!

select regexp_substr('17,20,23','[^,]+',1,level) as str from dual  connect by  level <= length('17,20,23')-length(regexp_replace('17,20,23',',','')) + 1
17

2023

完美!這裡還有乙個函式:regexp_replace

regexp_replace(source_char, pattern [, replace_string [, position [, occurrence [, match_parameter ] ] ] ] )

source_char     :需要進行處理的字串

pattern    :進行匹配的正規表示式

replace_string   :替換的字元

position :從第幾個字元開始正規表示式匹配。(預設為1)

occurrence   :標識第幾個匹配組

match_parameter

:取值範圍

還有乙個很關鍵的 level

from dual

看這個小例子就明白了。level叫oracle的偽列。

Oracle資料庫中IN引數個數超過1000的問題

1.用表關聯代替in 2.在where條件中使用子查詢,如 select from b where c in select d from e 這樣的形式。順便在這裡擴充一下in和exists。在sql優化中,in與exists的區別就是,當括號裡面值少的話,用in效率會比較高,值多的話用exists...

引數個數可變的函式

今天突然想起引數個數可變的函式,然後想了下,覺得自己還真不太了解它,遂決定弄清楚。1.如何取得可變引數 比如 void f int fixpara1,char p char fixpara1 取得固定引數位址 cout int p 為什麼p 4可以取到第乙個可變引數呢?因為引數在函式被呼叫前,會逐個...

可變引數個數的函式

type vafunction type arg1,type arg2,引數可以分為兩部分 個數確定的固定引數和個數可變的可選引數。函式至少需要乙個固定引數,固定引數的宣告和普通函式一樣 可選引數由於個數不確定,宣告時用 表示。固定引數和可選引數公同構成乙個函式的引數列表。標準c c 包含標頭檔案s...