在網上搜了一下,解決方案都是將引數分段,即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...