我们在做多个字段模糊查询时,是不是觉得非常麻烦?比如我要模糊查询某表多个字段存在某数据时,如下

select * from table where a like '%key%' or b  like '%key%' or c like '%key%'..........

上面的语句不但长,而且写起来好麻烦。我们是不是有更好的办法呢?

答案是肯定的。我们可以这样写:

SELECT * FROM  table where CONCAT(a,b,c......) like '%key%'

这样不就显得很简单,很简洁?

如果存在N个字段,而你又不情愿一个一个的手写每个字段,你又该如何呢?

我的思路是这样的,首先读取某表所有的字段,比如读出来某表含有a,b,c,d....等字段(select name from syscolumns where id=object_id(TableName)语句可以读取某表字段信息),

然后将这些字段拼接到concat中,拼接的结果像这样的:SELECT * FROM  table where CONCAT(a,b,c......) like '%key%'

这样一来,简单了很多,减少了繁琐不必要的sql拼接操作。

本人为了这个问题,也做了一些程序demo,以便大家互相学习。

0.列名实体类

  public class SysColumns
{
public string Key { get; set; }
public string ColumnName { get; set; }
}

1,枚举查询倒序,排序

    public enum OrderType
{
/// <summary>
/// 倒序
/// </summary>
Desc = 0,
/// <summary>
/// 顺序
/// </summary>
ASC = 1,
}

2.分页实体类

public class Paging
{
/// <summary>
/// 总数
/// </summary>
public int TotalItems { get; set; }
/// <summary>
/// 每页多少条
/// </summary>
public int ItemsPerPage { get; set; }
/// <summary>
/// 当前页
/// </summary>
public int CurrentPage { get; set; }
/// <summary>
/// 总共多少页
/// </summary>
public int TotalPages
{
get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); }
}

3.帅选条件

  public class SelectField
{
/// <summary>
/// 表名
/// </summary>
public string TableName { get; set; } /// <summary>
/// 查找的关键字
/// </summary>
public string Key { get; set; } /// <summary>
/// 其他条件
/// </summary>
public string OtherWhere { get; set; } /// <summary>
/// 排序字段
/// </summary>
public string OrderField { get; set; } /// <summary>
/// 排序类型
/// </summary>
public string OrderType { get; set; }
}

4.封装的方法

    public class SelectForMoreField<T> where T : new()
{
private string conn = null;
/// <summary>
/// 连接字符串
/// </summary>
public SelectForMoreField()
{
conn = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
}
/// <summary>
/// 判断SqlDataReader是否存在某列
/// </summary>
/// <param name="dr">SqlDataReader</param>
/// <param name="columnName">列名</param>
/// <returns></returns>
private bool readerExists(SqlDataReader dr, string columnName)
{
dr.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '" + columnName + "'";
return (dr.GetSchemaTable().DefaultView.Count > 0);
}
/// <summary>
/// 带有分页的多字段查询
/// </summary>
/// <param name="TableName">表名</param>
/// <param name="KeyWord">查询关键字</param>
/// <param name="page">当前页号</param>
/// <param name="take">每页显示行数 </param>
/// <returns></returns>
public IList<T> QueryForMoreField(SelectField field, Paging page)
{
IList<SysColumns> ls = GetTableField(field.TableName);
StringBuilder sb = new StringBuilder();
sb.Append("SELECT [t1].* FROM (SELECT ROW_NUMBER() OVER (ORDER BY [t0]." + field.OrderField + " " + field.OrderType + ") AS [ROW_NUMBER], [t0].* FROM "); sb.Append(field.TableName);
sb.Append(" AS [t0]");
sb.Append(" where ");
int i = 0;
sb.Append("CONCAT(");
foreach (SysColumns sysc in ls)
{
sb.Append(" cast(" + sysc.ColumnName + " as nvarchar(max)),");
if ((ls.Count - 1) == i)
{
sb.Append(" cast(" + sysc.ColumnName + " as nvarchar(max)))");
sb.Append(" like '%" + field.Key + "%'");
}
i++;
}
if (!String.IsNullOrEmpty(field.OtherWhere))
{
sb.Append("and ");
sb.Append(field.OtherWhere);
}
sb.Append(" ) AS [t1] ");
sb.Append("WHERE [t1].[ROW_NUMBER] BETWEEN ((" + page.CurrentPage + "*" + page.ItemsPerPage + ") - (" + page.ItemsPerPage + " -1)) AND (" + page.CurrentPage + "*" + page.ItemsPerPage + ")");
sb.Append("ORDER BY [t1].[ROW_NUMBER]");
string sql = sb.ToString();
IList<T> list;
Type type = typeof(T);
string tempName = string.Empty;
using (SqlDataReader reader = SqlHelper.ExecuteReader(conn, CommandType.Text, sql))
{
if (reader.HasRows)
{
list = new List<T>();
while (reader.Read())
{
T t = new T();
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (readerExists(reader, tempName))
{
if (!pi.CanWrite)
{
continue;
}
var value = reader[tempName];
if (value != DBNull.Value)
{
pi.SetValue(t, value, null);
}
}
}
list.Add(t);
}
sb = null;
sql = null;
conn = null;
return list;
}
}
return null;
}
/// <summary>
/// 简单的条件查询
/// </summary>
/// <param name="field">查询条件</param>
/// <returns></returns>
public IList<T> QueryForMoreField(SelectField field)
{
IList<SysColumns> ls = GetTableField(field.TableName);
StringBuilder sb = new StringBuilder();
sb.Append("SELECT * FROM " + field.TableName);
sb.Append(" where ");
int i = 0;
sb.Append("CONCAT(");
foreach (SysColumns sysc in ls)
{
sb.Append(" cast(" + sysc.ColumnName + " as nvarchar(max)),");
if ((ls.Count - 1) == i)
{
sb.Append(" cast(" + sysc.ColumnName + " as nvarchar(max)))");
sb.Append(" like '%" + field.Key + "%'");
}
i++;
}
string sql = sb.ToString();
IList<T> list;
Type type = typeof(T);
string tempName = string.Empty;
using (SqlDataReader reader = SqlHelper.ExecuteReader(conn, CommandType.Text, sql))
{
if (reader.HasRows)
{
list = new List<T>();
while (reader.Read())
{
T t = new T();
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (readerExists(reader, tempName))
{
if (!pi.CanWrite)
{
continue;
}
var value = reader[tempName];
if (value != DBNull.Value)
{
pi.SetValue(t, value, null);
}
}
}
list.Add(t);
}
sb = null;
sql = null;
conn = null;
return list;
}
}
return null;
}
/// <summary>
/// 获取表中所有字段
/// </summary>
/// <param name="TableName">表名</param>
/// <returns></returns>
public IList<SysColumns> GetTableField(string TableName)
{
SqlDataReader read = SqlHelper.ExecuteReader(conn, CommandType.Text, "select name from syscolumns where id=object_id('" + TableName + "')");
IList<SysColumns> ls = new List<SysColumns>();
while (read.Read())
{
SysColumns co = new SysColumns();
co.Key = Guid.NewGuid().ToString().Replace("-", "");
co.ColumnName = read.GetString(0);
ls.Add(co);
}
read.Close();
return ls;
}
}

5.调用演示

  class Program
{
// static string conn = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
static void Main(string[] args)
{
SelectForMoreField<Product> ls = new SelectForMoreField<Product>();
SelectField field = new SelectField();
field.TableName = "Product";
field.Key = "1";
field.OtherWhere = "Id > 12281";
int y = (int)OrderType.Desc;
field.OrderType = ((OrderType)y).ToString();
field.OrderField = "Id";
Paging page = new Paging();
page.CurrentPage = 1;
page.ItemsPerPage = 10;
IList<Product> data = ls.QueryForMoreField(field, page);
foreach (var d in data)
{
Console.WriteLine("ID:"+d.Id+" Name"+d.Name);
}
}

注:这只是个简陋粗糙的实现而已,后续精简程序,拓展Linq 这类方法,程序无法提供下载,因为不知道博客园编辑器如何上传,见谅。

注意:本程序支持sql2008 R2以上的数据库

某表含有N个字段超精简模糊查询方法的更多相关文章

  1. 【摘录】某表含有N个字段超精简模糊查询方法

    SELECT * FROM  table where CONCAT(a,b,c......) like '%key%' select name from syscolumns where id=obj ...

  2. 多字段非连续模糊查询java实现

    工作需要,写了一个实现数据库多字段模糊查询的方法,背景是输入用户的信息,如用户的userid,姓名,拼音等,可以查出相关的用户 具体如下 1. 操作一张表,可以设置表前缀 2. 可以实现中文的不连续查 ...

  3. MySQL数据库一个字段对应多个值得模糊查询和多个字段对应一个模糊查询

    当一个字段想模糊查询出多个字段的时候,正常情况下一般会这么作 1 select * from a where name like 'a%' or name like 'b%' ....or ...; ...

  4. 关于mongodb按照字段模糊查询方法

    模糊查询:tname包含某个关键字测试' cd /opt/soft/mongodb/bin ./mongo --host 192.168.0.1  --port 17017  test db.test ...

  5. Oracle 表分组 group by和模糊查询like

    分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...

  6. Mybatis mysql 一个搜索框多个字段模糊查询 几种方法

    第一种 or 根据搜索框给定的关键词,模糊搜索用户名和账号都匹配的用户集合 <select id="list" parameterType="com.user.Us ...

  7. Mysql多字段模糊查询

    MySQL同一字段多值模糊查询 一. 同一字段多值模糊查询,使用多个or进行链接,效率不高,但没有更好的解决方案.(有看到CHARINDEX 关键字,可查询结果并不是模糊,举个栗子 例如SELECT ...

  8. 【转载】制作一个超精简的WIN7.gho

    首先说明一点,这个Resource不是我制作的,Google搜了下GHO镜像文件制作,挺复杂的.如果要从头到尾自己制作GHO文件可以参考: http://baike.so.com/doc/674790 ...

  9. 一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句

    参考:https://bbs.csdn.net/topics/330032307 数据库里面有一个字典表,这张表里面有id段和对应的名字字段.在另外一个记录的表里面有对应的上述字典表的id,而且有多个 ...

随机推荐

  1. curl -x 127.0.0.1:80

    curl -x ip:80 +网址 就相当于在本地hosts文件指定一个域名,具有优先访问权.(curl -x 127.0.0.1:80这个方法适用于生产环境的服务器来测试自己做为代理商访问是否正常) ...

  2. Storm wordcount Read from file

    source code: package stormdemo; import java.io.BufferedReader; import java.io.BufferedWriter; import ...

  3. 2.NopCommerce中文语言包

    由于NopCommerce是纯英语环境,给英语不好的管理人员带来诸多不便. NopCommerce支持多语言环境,所以我们只要安装中文语言包,让NopCommerce支持后台中文操作环境. 首先先下载 ...

  4. excel vba 当cell的值变化时 进行判断操作

    示例效果: ----------- 在excel的sheet1中, 当A列的值 大于100时 ,其对应B列背景显示红色,C列显示"有数据" 否则,B列背景色正常,C列清空相应的数据 ...

  5. [转]响应式表格jQuery插件 – Responsive tables

    本文转自:http://www.shejidaren.com/responsive-tables-for-bootstrap-3.html 这个Responsive tables jQuery插件依赖 ...

  6. JVM的内存区域划分

            JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...

  7. selenium如何识别验证码

    一:前面的文章写了如何右键另存为图片,把验证码存为图片后,接下来就是要做,怎么把图片上的内容获取到,借住tesseract工具 1.下载tesseract:http://sourceforge.net ...

  8. UVALive 6656 Watching the Kangaroo --二分

    题意:给你一些区间,再查询一些点,问这些点与所有区间形成的最小距离的最大值.最小距离定义为:如果点在区间内,那么最小距离为0,否则为min(pos-L[i],R[i]-pos). 解法:当然要排个序, ...

  9. 定制你的Unity编辑器

    Unity的编辑器可以通过写脚本进行界面定制,包括添加功能菜单,今天写游戏Demo用到了记录一下. 为Unity添加子菜单 示例程序 [AddComponentMenu("Defend Ho ...

  10. Unity 2D Sprite Lighting

    2D游戏中也可以使用灯光?这真是一个好消息,接下来,我将为大家写一下教程 操作步骤 1.创建一个Materilas,修改Shader为 2.创建一个Sprite(使用黑色的图片) 3.创建一个Poin ...