标签:eve 循环 dual nec back 一个 col ack lis
在项目中, 经常会碰到这样的场景, 要按 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.
结论, 推荐使用第2种写法.
标签:eve 循环 dual nec back 一个 col ack lis
原文地址:https://www.cnblogs.com/harrychinese/p/sql_in_clause.html