如何優雅地拼SQL的in子句


============================================

in 語句如何優雅拼接 name list 

============================================

在項目中, 經常會碰到這樣的場景, 要按 name  list 獲取這些name對應的記錄,  比如要獲取 KING,JONES,FORD 對應的記錄,  顯然想到的是使用 in 子句, 

比如:  select id from Employee where Emp_Name in ('KING','JONES','FORD') 

 有幾種做法:

1. 硬拼 SQL的方法,  比如  sql =   "select id from Employee where Emp_Name in ( "+ "   'KING','JONES','FORD' " +")" 

   問題是代碼可讀性非常差, 需要先將 name list 打散, 然后為每個 name先包一個單引號, 然后再套一個循環, 構建完整的 in 子句. 

2. 使用 Connect by  的寫法(SQL server 對應的有 Split table function)

Select id
From   Employee 
Where  Emp_Name In
      (Select Regexp_Substr('KING,JONES,FORD'
                           ,'[^,]+'
                           ,1
                           ,Level) Emp_Name
       From   Dual
       Connect By Regexp_Substr('KING,JONES,FORD'
                               ,'[^,]+'
                               ,1
                               ,Level) Is Not Null);

   貌似代碼很長,  但可讀性非常好, 只要傳兩次 name list 即可.   不需要打散name list,  不需要為單個name包單引號, 不需要使用循環重新構建一個帶單引號的 name list. 

3. 使用 

Select id
From   Employee 
Where  Emp_Name In table(split('KING,JONES,FORD',','))

 

結論, 推薦使用第2和第3種寫法. 

 

============================================

like 如何優雅拼接 name list 

============================================

in 子句可以將多個候選條件集中在一起, like 操作符沒有同樣的語法, 但我們可以使用正則表達式達到類似的效果. 

    select id from Employee Where Emp_Name  regexp_like (emp_name '^KING|JONES|FORD')

等同於

select id from Employee Where Emp_Name  like 'KING%'
or Emp_Name  like 'JONES%'
or Emp_Name  like 'FORD%'
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM