在我們實際的程式開發中,經常會有查詢某個欄位值在幾個選項中是否存在的情況.
如:
instr(',張三,李四,王五,老六,',name)>0
這樣字符太長可能也會影響性能.實際上我們也可以將這個字串變成一個虛擬表,
然后再將事實資料表與虛擬表關聯即可.
如:
select replace(regexp_substr('張三,李四,王五,老六,','.*?,',1,level),',')
from dual
connect by level<=lengthb('張三,李四,王五,老六,')-lengthb(replace('張三,李四,王五,老六,',','));
如果結合Oracle 9i以上支持的with語法,進行資料預處理,可能會更佳.
with
t as (
select replace(regexp_substr('張三,李四,王五,老六,','.*?,',1,level),',') as name
from dual
connect by level<=lengthb('張三,李四,王五,老六,')-lengthb(replace('張三,李四,王五,老六,',',')) )
select * from table_name where name = t.name