sqlクエリー文の組合せクエリーの汎用実装アルゴリズム(c++版、java版)
22096 ワード
今、私たちがやっている大規模なプロジェクトの多くは関係型データベースとインタラクティブで、みんながこのような問題に遭遇したかどうか分かりません.組み合わせクエリー、2つの条件A、B、組み合わせの状況はA、B、AB、つまり3種類で、SQL文を書くのも面倒ではありません.いくつかのif、elseではありませんか.しかし、3つの条件の組み合わせがあれば?A,B,C,そうするとA,B,C,AB,AC....これはn個if、elseにしましょう.
OK、次は汎用アルゴリズムを書いて以上の問題を解決します.
まずはC++版
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(){};
- };
-
- // 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;
- }
- }
この は「 の 」ブログから ていますので、ぜひこの を してください.http://yaocoder.blog.51cto.com/2668309/581843