如何优雅地拼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%'