支持Oracle的模糊查询和精准查询

相信所有的软件开发者都做过页面上的查询功能,而且很多都需要既支持模糊查询的,也需要支持精准查询的,而且不需要增加多余的功能,只需要在文本框中输入包含类似*之类的符号即可。

下面的方法就是通过*来判断到底是模糊查询还是精准查询,方法如下:

        /// <summary>
        /// 通过输入文本和字段名称来组织返回的查询字符串
        /// </summary>
        /// <param name="query_name">input string</param>
        /// <param name="query_field">query field</param>
        /// <returns></returns>
        public string QueryString_By_QueryType(string query_name, string query_field)
        {
            string query_string = string.Empty;
            //replace consecutive star siginal to be one star siginal, eg. '***' = '*'
            query_name = Regex.Replace(query_name, @"\*{1,}", "*");
            

            //Split the condition to be a Array
            string[] conditionList = query_name.Split('*').Where(A=>!string.IsNullOrEmpty(A)).ToArray();
            if (conditionList.Length == 1)
            {
                if (!string.IsNullOrEmpty(query_string))
                {
                    query_string += " AND ";
                }
                if (!query_name.Contains('*'))
                {
                    query_string += query_field + " = '" + conditionList[0] + "'";
                }
                else
                {
                    if (query_name.StartsWith("*"))
                    {
                        query_string = query_field + " LIKE '" + query_name.Replace('*', '%') + "'";
                    }
                    if (!string.IsNullOrEmpty(query_string))
                    {
                        query_string += " AND ";
                    }
                    if (query_name.EndsWith("*"))
                    {
                        query_string += query_field + " LIKE '" + query_name.Replace('*', '%') + "'";
                    }
                }
            }
            else if (conditionList.Length > 1)
            {
                foreach (var condition in conditionList)
                {
                    if (!string.IsNullOrEmpty(query_string))
                    {
                        query_string += " AND ";
                    }
                    query_string += "INSTR(" + query_field + ", '" + condition + "', -1) > 0";
                }
                for (int i = 1; i < conditionList.Length; i++)
                {
                    if (i < conditionList.Length)
                    {
                        if (!string.IsNullOrEmpty(query_string))
                        {
                            query_string += " AND ";
                        }
                        query_string += "INSTR(" + query_field + ",'" + conditionList[i - 1] + "', -1) < INSTR(" + query_field + ",'" + conditionList[i] + "', -1)";
                    }
                }
            }

            return query_string;
        }

  调用的时候只需要传入文本和字段名称即可,程序会根据*来判断到底该如何去组织查询语句。

       此方法只支持Oracle的查询,如果想要此方法支持SqlServer的查询,只需要把Oracle中的函数稍加修改即可。

posted @ 2017-11-22 11:14  wu9xia  阅读(1910)  评论(0编辑  收藏  举报