如何在SQL LIKE中使用sql IN子句

时间:2018-11-28 05:57:19

标签: sql postgresql spring-boot spring-jdbc

我有一个spring boot应用程序,在DAO类之一中,我们有一种方法在其中检索一些数据,为此,我们使用下面的查询,这里使用namedParameterJdbcTemplate

select student_id from student_records where create_date >= timestamp '"+appProps.getFromDate()+"' and  create_date <= timestamp '"+appProps.getToDate()+"' and student_id in (:studentIdList)

完整的方法如下所示

public List<String> readMatchingStudentIds_ALL(List<String> inputStudentIdsList){
            List<String> macthingStudentIdsList = new ArrayList<>();
            try{
                Map<String, List<String>> namedParameters = Collections.singletonMap("studentIdsList", inputStudentIdsList);
                String query = " select student_id from student_records where create_date >= timestamp '"+appProps.getFromDate()+"' and  create_date <= timestamp '"+appProps.getToDate()+"' and student_id in (:studentIdList)";

                macthingStudentIdsList =  namedParameterJdbcTemplate.queryForList(query, namedParameters, String.class);
            }catch(Exception e)
            {
                throw new RuntimeException(e.getMessage(),e);
            }
            return macthingStudentIdsList;
     }

一切正常,但是现在问题来了,例如,即将到来的学生名单中包含“ AFE1245”,但是在我们的数据库中,我们有类似“ 000AEF1245”的数据,我的意思是0加上前缀,我们不知道多少个0带有前缀,对于单个查询,我们可以使用如下所示的LIKE运算符

select student_id from student_records where student_id like '%input_student_id'

但是我的情况有所不同,因为我们需要使用sql IN子句,是我们可以同时使用sql IN子句和LIKE的可能性,还是它们的其他方式

2 个答案:

答案 0 :(得分:0)

您可以通过具有OR的单个LIKE来实现:

SELECT student_id FROM student_records
WHERE student_id LIKE '%input_student_id'
OR  student_id LIKE 'input_student_id%'
OR  student_id LIKE '%input_student_id%';

引用this

答案 1 :(得分:0)

假设student_id包含前导零,而您的参数不包含前导零,则可以简单地trim将它们:

AND TRIM(LEADING '0' FROM student_id) IN (:studentIdList)

话虽如此,如果student_id总是用0填充到固定长度,那么您在代码中对:studentIdList进行相同操作并按原样匹配它们。