【问题标题】:Handle Multiple Filters in Java -MySql在 Java 中处理多个过滤器 -MySql
【发布时间】:2014-11-26 04:20:18
【问题描述】:

共有三个过滤器 Class、Section 和 Date。现在有七种可能:

1- 用户输入类

2-)用户输入部分

3-)用户输入日期

4-) 用户输入日期和类别

等等……

我编写了以下代码来处理 java 中的这些可能性:

if( mySection.equals("0") && myClass.equals("0") && ( FDate.trim().compareTo("")==0 || TDate.trim().compareTo("")==0    ) )
        {
        out.println("Note: Please provide valid filteration attributes. Atleast one filter is required.");
        return;
        }



        if( !mySection.equals("0") && myClass.equals("0") && ( FDate.trim().compareTo("")==0 || TDate.trim().compareTo("")==0    ) )
        {
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and st.section='"+mySection+"'";
        }

        if( !mySection.equals("0") && !myClass.equals("0") && ( FDate.trim().compareTo("")==0 || TDate.trim().compareTo("")==0    ) )
        {
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and st.section='"+mySection+"' and st.level='"+myClass+"' ";
        }


        if( mySection.equals("0") && !myClass.equals("0") && ( FDate.trim().compareTo("")==0 || TDate.trim().compareTo("")==0    ) )
        {
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and st.level='"+myClass+"' ";
        }


        if( mySection.equals("0") && myClass.equals("0") && ( !(FDate.trim().compareTo("")==0) && !(TDate.trim().compareTo("")==0)    ) )
        {
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and date_format(time,'%Y-%m-%d %T') between '"+FromDate+"'  and '"+ToDate+"'";
        }


        if( mySection.equals("0") && !myClass.equals("0") && ( !(FDate.trim().compareTo("")==0) && !(TDate.trim().compareTo("")==0)    ) )
        {
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and date_format(time,'%Y-%m-%d %T') between '"+FromDate+"'  and '"+ToDate+"' and st.level='"+myClass+"'";
        }


        if( !mySection.equals("0") && myClass.equals("0") && ( !(FDate.trim().compareTo("")==0) && !(TDate.trim().compareTo("")==0)    ) )
        {
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and date_format(time,'%Y-%m-%d %T') between '"+FromDate+"'  and '"+ToDate+"' st.section='"+mySection+"'";
        }


        if( !mySection.equals("0") && !myClass.equals("0") && ( !(FDate.trim().compareTo("")==0) && !(TDate.trim().compareTo("")==0)    ) )
        {
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and date_format(time,'%Y-%m-%d %T') between '"+FromDate+"'  and '"+ToDate+"' and st.section='"+mySection+"' and st.level='"+myClass+"'";
        }

这就是问题所在,当我添加另一个过滤器时,这些可能性会急剧增加,因此会产生更多的查询和处理。 为了通过 JAVA 或 MYSQL 有效地处理这个问题,必须有一种方法。

针对这种情况的通用 sql 语句?

一个处理多个输入查询的 JAVA 库?

某事或其他...

可以用尽可能少的代码来处理这种情况(考虑到可能会添加过滤器)?

【问题讨论】:

    标签: java mysql sql filter


    【解决方案1】:

    解决了,经过一段时间的思考,我得出了一个解决方案。这是解决此问题的通用单一查询:

     if( mySection.equals("0") && myClass.equals("0") && ( FDate.trim().compareTo("")==0 || TDate.trim().compareTo("")==0    ) )
            {
            out.println("Note: Please provide valid filteration attributes. Atleast one filter is required.");
            return;
            }
    
    
            Query = "select st.rollno, concat(st.firstname,' ',st.midname,' ',st.lastname), st.level, st.section, st.rfidtag, sc.schoolname, sa.time, date_format(sa.time,'%T') from AAV.studentattendence sa, AAV.Students st, AAV.Schools sc where sa.studentindexptr=st.indexptr and sc.indexptr=st.schoolindexptr and ( '0'='"+mySection+"' or st.section='"+mySection+"') and ('0'='"+myClass+"' or st.level='"+myClass+"') and (  (' 00:00:00'='"+FromDate+"' and ' 23:59:59'='"+ToDate+"')  or (date_format(time,'%Y-%m-%d %T') between '"+FromDate+"'  and '"+ToDate+"' )  )";
    
    
    executeQuery(Query);
    

    当被视为表达式时,默认值解析为 true,在我的例子中为“0”,查询变得通用,我们可以根据需要添加尽可能多的过滤器子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多