对sql查询语句组合查询的通用实现算法(c++版,java版)
2013-11-05 16:30
603 查看
现在我们做的大型项目大多要与关系型数据库进行交互,不知道大家有没有遇到这样的问题,组合查询,两个条件A,B,组合情况有A,B,AB,也就三种,写死SQL语句也不麻烦,不就是几个if,else吗!但是要是有三个条件组合呢?A,B,C,这样就会有A,B,C,AB,AC....这要n个if,else吧.
ok,下面我们写个通用算法解决以上问题
首先C++版
[/code]
本文出自 “永远的朋友” 博客,请务必保留此出处http://yaocoder.blog.51cto.com/2668309/581843
ok,下面我们写个通用算法解决以上问题
首先C++版
// 查询条件结构 struct SelCondition { string m_strValueFirst; string m_strValueSecond; enum ConditionType {CT_EQUAL = 1, CT_NOT_EQUAL, CT_ABOVE, CT_BELOW, CT_FUZZY,CT_AREA,CT_GROUP} m_conType; //针对范围 SelCondition(string valueFirst,string valueSecond, SelCondition::ConditionType conType) { m_strValueFirst = valueFirst; m_strValueSecond=valueSecond; m_conType = conType; } //针对一个条件 SelCondition(string valueFirst, SelCondition::ConditionType conType) { m_strValueFirst = valueFirst; m_conType = conType; } SelCondition(string valueFirst) { m_strValueFirst = valueFirst; } SelCondition(){}; }; [code]// 返回不带 where 的条件语句,并且是以 and 开头,例如 and id>8 and name=aiht string DbOpBase::AssembleCondition(const map<string, SelCondition> &mapConditions) { string strCondition=""; typedef map<string, SelCondition>::const_iterator CI; for(CI p=mapConditions.begin(); p!=mapConditions.end(); ++p) { string strCmd; string colName = p->first; // TODO 判断列名是否是"" //进行查询类型的判定拼装相应条件 switch(p->second.m_conType) { case SelCondition::CT_ABOVE: strCmd = _T(" AND ") + colName + _T(" > '") + p->second.m_strValueFirst + _T("'"); break; case SelCondition::CT_BELOW: strCmd = _T(" AND ") + colName + _T(" < '") + p->second.m_strValueFirst + _T("'"); break; case SelCondition::CT_EQUAL: strCmd = _T(" AND ") + colName + _T(" = '") + p->second.m_strValueFirst + _T("'"); break; case SelCondition::CT_NOT_EQUAL: strCmd = _T(" AND ") + colName + _T(" != '") + p->second.m_strValueFirst + _T("'"); break; case SelCondition::CT_FUZZY: strCmd =_T(" AND ") + colName + _T(" like '%") + p->second.m_strValueFirst +_T("%'"); break; case SelCondition::CT_AREA: strCmd =_T(" AND ") + colName + _T(" BETWEEN '") + p->second.m_strValueFirst +_T("' AND '")+p->second.m_strValueSecond+_T("'"); break; case SelCondition::CT_GROUP: strCmd=_T(" group by StartTime "); break; default: ; } strCondition += strCmd; } return strCondition; } 来看看java版,其中带有自己所做项目的一些字段和逻辑,请见谅public class HostSearchCondition { //构造数据库的查询条件(=,%,between) public static final int CT_EQUAL = 0; public static final int CT_LIKE = 1; public static final int CT_AREA = 2; // 界面向数据库操作类传值——结构 public static class SelCondition { String m_strValueFirst; String m_strValueSecond; int m_conType; public SelCondition(String valueFirst,String valueSecond, int conType) { this.m_strValueFirst = valueFirst; this.m_strValueSecond=valueSecond; this.m_conType = conType; } public SelCondition(String valueFirst, int conType) { this.m_strValueFirst = valueFirst; this.m_conType = conType; } public SelCondition(String valueFirst) { this.m_strValueFirst = valueFirst; } public SelCondition(){}; }; static HashMap<String, SelCondition> sqlmap = new HashMap<String, SelCondition>(); /** *把组合查询条件传入map * @param 接收的组合查询条件 */ public static HashMap<String, SelCondition> Condition(HostBasicInfo condition) { sqlmap.clear(); SelCondition selcon; if(condition.getSName().length()!= 0) { selcon = new SelCondition(condition.getSName(), CT_EQUAL); sqlmap.put("sName", selcon); } if(condition.getSCharacterCode().length()!= 0) { selcon = new SelCondition(condition.getSName(), CT_LIKE); sqlmap.put("sCharacterCode", selcon); } if(condition.getNHostType().length()!= 0) { selcon = new SelCondition(condition.getNHostType(), CT_EQUAL); sqlmap.put("nHostType", selcon); } if(condition.getESecLevel().length()!= 0) { selcon = new SelCondition(condition.getESecLevel(), CT_EQUAL); sqlmap.put("eSecLevel", selcon); } return sqlmap; } /** *构造数据库where后的查询条件 * @param 组合查询条件map */ @SuppressWarnings("unchecked") public static String AssembleCondition(Map<String, SelCondition> mapConditions) { String strCondition=""; Iterator<?> iter = mapConditions.entrySet().iterator(); while (iter.hasNext()) { String strCmd = null; Map.Entry entry = (Map.Entry) iter.next(); String key = (String)entry.getKey(); String colName = key; SelCondition value = (SelCondition)entry.getValue(); switch(value.m_conType) { case CT_EQUAL: strCmd = " AND Tbl_Host_BasicInfo."+ colName + " = '" + value.m_strValueFirst + "'"; break; case CT_LIKE: strCmd =" AND Tbl_Host_BasicInfo." + colName + " like '%" + value.m_strValueFirst +"%'"; break; case CT_AREA: strCmd =" " + colName + " BETWEEN '"+ value.m_strValueFirst +"' AND '"+ value.m_strValueSecond+"'"; break; default: ; } strCondition = strCondition + strCmd; } return strCondition; } }
[/code]
本文出自 “永远的朋友” 博客,请务必保留此出处http://yaocoder.blog.51cto.com/2668309/581843
相关文章推荐
- 对sql查询语句组合查询的通用实现算法(c++版,java版)
- java执行SQL语句实现查询的通用方法
- java执行SQL语句实现查询的通用方法详解
- Java实现通用组合算法
- Java生成 sql查询语句 通用方法(带排序/分页)(未测试)
- Java实现通用组合算法
- 简述Java程序语言通用组合算法的实现
- Java实现通用组合算法
- Java实现通用组合算法
- 商城中商品筛选的SQL查询组合语句的实现,表结构、传值都完成!
- Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句'' ""作用
- SQL语句查询每个分组的前N条记录的实现方法
- java排列组合算法代码实现
- 用标准的SQL语句实现查询记录分页
- 请用SQL 语句实现:从account表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。
- mysqli实现多条sql语句查询
- 使用反射让linq实现动态查询, 类似拼接sql语句的where 条件
- 动态组合SQL语句方式实现批量更新的实例
- mysql 下 计算 两点 经纬度 之间的距离 含具体sql语句以及伪列作为查询条件实现
- 求组合算法实现_二进制数_Java