============================================
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%'