<select id="mapper中的方法名" resultType="返回类型">
select
t.id as id,
t.user_name as username,
t.age as age
from
user t
<where>
<!-- choose when 可以不加,我这里是业务需要 -->
<choose>
<when test="list != null and list.size() > 0">
<!-- 集合不为空时,遍历,下方sepatator中的or,是因为业务需要,你可以根据自己的需求选择分隔符 -->
<foreach collection="list" item="item" index="index" open="(" separator="or" close=")">
(
t.user_name = REGEXP_SUBSTR(#{item}, '[^-]+', 1, 1)
and t.age= REGEXP_SUBSTR(#{item}, '[^-]+', 1, 2)
)
<foreach>
</when>
<otherwise>
<!-- 集合为空时,添加其他条件 -->
1 = 1
</otherwise>
</choose>
</where>
</select>
上方sql中遍历的list是从mapper中传入的参数,list中的数据结构为:
List<String> nameAndAgeList = new ArrayList<>();
nameAndAgeList.add("张三-18");
nameAndAgeList.add("李四-20");
nameAndAgeList.add("王五-25");
Mapper:
List<User> selectListByNameAndAge(@Param("list") List nameAndAgeList);
由于Oracle中是没有split函数的,但是可以用Oracle的内置函数和正则表达式来实现类似的功能。
以下是一个例子:切割短横线‘-’为分隔符的字符串'A-B-C'
SELECT REGEXP_SUBSTR('A-B-C', '[^-]+', 1, 1) AS first_val FROM DUAL;
REGEXP_SUBSTR函数,它的参数如下:
第一个参数'A-B-C'是要分割的字符串。
第二个参数是正则表达式,这里是'[^-]+',表示匹配短横线‘-’以外的一个或多个字符。
第三个参数是开始位置,这里是1,表示从字符串的开始处进行匹配。
第四个参数是切割后值的位置,这里是1,表示取第一个匹配的部分,就是'A'。