如何优雅地拼SQL的in子句
Posted harrychinese 刘忠武
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何优雅地拼SQL的in子句相关的知识,希望对你有一定的参考价值。
在项目中, 经常会碰到这样的场景, 要按 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种写法.
以上是关于如何优雅地拼SQL的in子句的主要内容,如果未能解决你的问题,请参考以下文章
如何转换逗号分隔的 varchar 以用于 pl/sql 中的“IN”子句?