Oracle Multi_like函數

在VFP裏面,有個很噁心的函數叫作inlist()。sql

它能夠做爲數組

inlist('%A%','%B%','%C%')

 

一次過like好幾個,或者like一個數組。函數

 

好吧,由於業務需求,咱們的SQL也有這樣的需求。oop

爲了知足這個要求,我本身寫了一個Multi_like函數來實現。google

 

經過輸入兩個字符串,進行多個對比。code

想上函數代碼。字符串

create or replace function func_multi_like(p_src varchar2, p_str varchar2)
 return number
 is
 v_result number default 0;
 v_str varchar2(200);
 v_posistion number;
 v_sub_str varchar2(200);  --截取的STR
 v_tmp_str varchar2(200); --截取後剩下的str
 begin
 --全角半角轉換
  v_str := REPLACE(p_str,',',',');
  v_str := trim(v_str);
  
  v_posistion:= instr(v_str,',');
  --判斷有沒有逗號?
  if v_posistion > 0 then

    --有逗號 截取str
    v_sub_str := trim(substr(v_str,0,v_posistion));
    --截取後剩下的str
    v_tmp_str := trim(substr(v_str,v_posistion+1 ,LENGTH(v_str)-v_posistion));

    --找不到逗號時,退出
    while v_posistion <> 0 loop
        --重置
        v_posistion := 0;
    
        --若是截取下來的不單單是逗號,則進截取數據判斷。
        --若是有一個匹配成功,則result>0
        if LENGTH(v_sub_str)>1 and instr(p_src,trim(substr(v_sub_str,0,LENGTH(v_sub_str)-1)))> 0 
        then   
               v_result:= instr(p_src,trim(substr(v_sub_str,0,LENGTH(v_sub_str)-1)));
        end if;

        v_posistion:= instr(v_tmp_str,',');
        
        v_sub_str := trim(substr(v_tmp_str,0,v_posistion));
        v_tmp_str := trim(substr(v_tmp_str,v_posistion+1,LENGTH(v_tmp_str)-v_posistion));

        
    end loop;
       
      if instr(p_src,trim(v_tmp_str))> 0 
         then v_result:= instr(p_src,trim(v_tmp_str));
      end if;
        
  else
    --沒有逗號,直接匹配
    v_result:= instr(p_src,v_str) ;
  end if;

  return v_result;  --返回0,則匹配失敗,返回大於0則匹配成功。
 end;
 

輸入兩個參數,進行匹配。io

 

舉例,如要匹配google,baidu,sina,則能夠以下使用 table

select * 
from media_table 
where  func_multi_like(media_name,'google,baidu,sina')>0
 

也就是說,若是media_name like googlefunction

或者 like baidu

或者 like sina

就會返回一個大於0的值。

 

注意,這裏是like,不是=,若是是=用IN就行了。

相關文章
相關標籤/搜索