查询逻辑表达式:(1+2),3   表达式1查询条件 1:a0123='回族'  表达式2
         2:a0134='女'
         3:a0135='已婚'我现在要把 表达式一中的数字,替换为相对应的查询条件,但是在替换2的时候会把 字段里面的数字2也给替换了,
不知道有没有更好的实现 

解决方案 »

  1.   

    可能我没有表达清楚(如果用户单纯的设置查询条件的话 我可以直接 and 连接)但是,用户还可以设置查询条件的查询逻辑关系比如 and 或则 or 或者在两个条件之间加上() 在这种情况下,我的记录下他的逻辑顺序
    之后在替换为 相应的查询条件, 但是字段里又包含数字,真是头疼
      

  2.   

    参数这个不是问题
    用spring的simplejdbctemplate 的话 sql语句里面可以输入参数的关键要整理出一个 比较完整的逻辑 最好是用户和数据库兼容的
    如果不能整理成一个  那就分为客户的和 数据库的 然后自己转换下
      

  3.   

    猜测LZ要表达的意思:
    查询逻辑表达式:(1+2),3 表达式1//这句是查询对象查询条件: 表达式2            //这句是查询条件
    1:a0123='回族'
    2:a0134='女'
    3:a0135='已婚'
    问题:
    现在LZ想实现的是将表达式1中的1,2,3用表达式2中的查询条件替换,意思就是说将
    “(1+2),3”替换成“(a0123='回族'+a0134='女'),a0135='已婚'”
      

  4.   

    如果不根据 (1+2),3 里面的数字来替换成相应的查询语句的话,得写多少if substring 啊
      

  5.   

    详细一点的说,就是 用户设置了多个查询条件,并且用户可以指定查询条件之间的逻辑关系(我用+ 或 ,连接这个逻辑关系,也支持括号比如(1+2),3 ==(1 and 2) or 3 ),并同时把逻辑关系和查询条件发送到后台,并通过对逻辑关系的解析来动态拼装 where 子句,但问题是 因为字段里面包含数字,所以替换不了)目前除了替换没有更好的思路来解析并替换,希望各位提供一个其他的思路
      

  6.   

    给你一个方案!~~~ 
    页面上传递参数的时候 修改为查询字符串,
    最后把  sql 字符串 连接起来!~~ 
    传参数的时候 就修改成你需要的数字 
    不要传过去了 再替换!~~
      

  7.   

    O(∩_∩)O哈哈~搞定了,没有用替换
    代码如下:    /**
     * 根据json查询 条件拼装 sql 查询条件
     * @param mainTab           查询的主表名称
     * @param mianPk            主键(只能有一个,并且主附表都包含的)
     * @param condtion          查询条件
     * @param logicCondition    查询的逻辑条件
     * @return
     */
    public String getSearchCondition(String condtion,String logicCondition,String mainTab,String mianPk)
    {
    String sql="";
    try { if(!"".equals(condtion)&&!"".equals(logicCondition)&&!"".equals(mainTab))
    {
    /*保存表的集合*/ List<String> tabNameList=new ArrayList<String>();
    org.json.JSONArray jsaArray=new org.json.JSONArray(condtion);
    String saveLogicContion=""; List<String> indexList=new ArrayList<String>();
    List<String> valueList=new ArrayList<String>();
    for(int i=0;i<logicCondition.length();i++)
    {
    char tempChar=logicCondition.charAt(i);
    if(tempChar>='0'&&tempChar<='9')
    {
    /*记录数字的索引下标*/
    indexList.add(i+"");
    valueList.add(tempChar+"");
    }
    }
    for(int i=0;i<indexList.size();i++)
    {
    String str="";
    String loigcNumber=valueList.get(i);
    if(i==0)
    {
    /*取出第一个字符*/
    str=logicCondition.substring(0,Integer.valueOf(indexList.get(i)));
    }
    else
    { int tempNumber=Integer.valueOf(indexList.get(i-1))+1;
    str=logicCondition.substring(tempNumber,Integer.valueOf(indexList.get(i)));
    }
    for(int k=0;k<jsaArray.length();k++)
    {
    JSONObject jObject=jsaArray.getJSONObject(k);
    String logic=String.valueOf(jObject.get("logic"));
    String tabname=String.valueOf(jObject.get("tabname"));
    String fielName=String.valueOf(jObject.get("fielName"));
    String seDenotation=String.valueOf(jObject.get("seDenotation"));
    String filevalue=String.valueOf(jObject.get("filevalue"));
    String params=String.valueOf(jObject.get("params"));
    String tempStr=tabname+"."+fielName+seDenotation+"'"+filevalue+"'  ";
    if(!tabNameList.contains(tabname))
    {
    tabNameList.add(tabname);
    }
    if(loigcNumber.equals(logic))
    {
    saveLogicContion+=str+tempStr;
    break;
    }
    }
    }
    /*此种情况适用于 (1+2),(1+3) or (1+2),3,*/
    int logicLenth=logicCondition.length()-1;
    int tempIndex=Integer.valueOf(indexList.get(indexList.size()-1));
    if(tempIndex!=logicLenth)
    {
    String tempStr=String.valueOf(logicCondition.charAt(logicLenth));
    if(")".equals(tempStr))
    {
    saveLogicContion+=tempStr;
    }
    }  String newCon=saveLogicContion.replace("-"," and ");
    String newCon2=newCon.replaceAll(","," or ");
    String tabName="";
    for(int i=0;i<tabNameList.size();i++)
    {
    String tab=tabNameList.get(i);
    tabName+=tab;
    // mainCondition+=mainTab+"."+mianPk+"="+tab+"."+mianPk;
    if(tabNameList.size()>=2&&i!=tabNameList.size()-1)
    {
    tabName+=",";
    //mainCondition+=" and ";
    }
    }
    //sql=tabName+"-"+newCon2+"-"+mainCondition;
    sql=tabName+"-"+newCon2;
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return sql;
    }