1. 概述
1.1 应用场景
模糊查询,是一种很方便的查询方式,用来查询符合某种指定格式的数据。比如用户想查询所有姓张的销售员的数据,就可以使用模糊查询。
1.2 实现思路
模糊查询也是一种 筛选查询,但和精准查询不同的是模糊查询匹配方式是模糊匹配。我们知道筛选查询 可以通过数据集参数和模板参数两种方法实现,那模糊查询也就对应两种实现方式。
数据集参数:利用数据库 SQL 语言的模糊搜索,如 “like”、通配符“_”、“%”,对数据进行模糊查询。
模板参数:通过设计器的“包含”、“开头是”、“结尾是”等不完全匹配过滤条件过滤数据。
2. 实现方法
2.1 数据集参数
数据集参数 是定义在 SQL 语句中的参数,即在 SQL 查询数据时,就实现了数据的过滤。如果你的数据是从数据库查询获得,推荐使用此方法。
2.1.1 定义数据集参数
通过数据集参数实现模糊查询时,首先要根据你想要实现的模糊匹配原则和所使用的数据库支持的 SQL 语法定义一个数据集参数。
如使用 FRDemo 中销量表,查询某个姓氏的销售员的数据。FRDemo是一个 SQLite 数据库,支持 Like 匹配的用法,所以数据集参数可以如下定义:SELECT * FROM 销量 where 销售员 like '%${name}%',这样就定义了一个 name 参数,只要销售员姓名含有 name,就会被匹配到。
如下列出了一些数据库中常用的模糊查询的语法,用户可以根据实际链接的数据库选择使用。
符号 | 定义 | 数据库 | 语句 |
---|---|---|---|
"%" | 表示任意 0 个或多个字符 | SQLServer Oracle MySQL | Select * from 表名 where 列名 like '%' //查询出全部 Select * from 表名 where 列名 like 'x' //完全匹配查询 Select * from 表名 where 列名 like '%x' //右为x,前面可以有任意位字符 Select * from 表名 where 列名 like 'x%' //左为x,后面可以有任意位字符 Select * from 表名 where 列名 like '%x%' //中间为x,左右都可以有任意位字符 注:x 支持替换为参数,例如 SELECT * FROM 销量 where 销售员 like '%${name}%' |
"_" | 表示单个字符 | SQLServer Oracle MySQL | Select * from 表名 where 列名 like '_x' //右为x,前面有一位字符 Select * from 表名 where 列名 like '__x' //右为x,前面有两位位字符 Select * from 表名 where 列名 like 'x__' //左为x,后面有两位位字符 |
"[]" | 表示括号内所列字符中的一个 指定一个字符,字符串或者范围,要求所匹配对象是他们中的任意一个 注:如 [ ] 内有一系列字符( 01234、abcde 之类的)则可略写为“0-4”、“a-e” | SQLServer | Select * from 表名 where 列名 like '[张李王]三' //将找出“张三”,“李三”,“王三”(而不是“张李王三”) Select * from 表名 where 列名 like '老[1-9]' //将找出“老1”,“老2”,……,“老9” |
Oracle | select * from 表名 where regexp_like(列名,'[张李王]三') //将找出“张三”,“李三”,“王三”(而不是“张李王三”) | ||
MySQL | select * from 表名 where 列名 rlike '[张李王]三' //将找出“张三”,“李三”,“王三”(而不是“张李王三”) select * from 表名 where 列名 regexp '[张李王]三' //将找出“张三”,“李三”,“王三”(而不是“张李王三”) | ||
"[^]" | 表示不在括号列中的单个字符 其取值与[]相同,但它要求所匹配对象为指定字符以外的任一字符 | SQLServer | Select * from 表名 where 列名 like '[^张李王]三' //将找出不姓“张”,“李”,“王”的“赵三”,“孙三”等 Select * from 表名 where 列名 like '老[^1-4]' //将排除“老1”到“老4”,寻找“老5”,“老6”、…… |
Oracle | select * from 表名 where regexp_like(列名,'[^李王]三') //将找出不姓“李”,“王”的“赵三”,“孙三”等 | ||
MySQL | select * from 表名 where 列名 rlike '[^李王]三' //将找出不姓“李”,“王”的“赵三”,“孙三”等 select * from 表名 where 列名 regexp '[^李王]三' //将找出不姓“李”,“王”的“赵三”,“孙三”等 | ||
特殊字符模糊查询 | 当要查询的字符串包含通配符的时候,可以采用下面的方法来查询 | SQLServer | 用[ ]将特殊字符包含: select * from 表名 where 列名 like '_[%]_' |
Oracle | 用 escape 关键字将特殊字符转义: select * from 表名 where 列名 like '_\%_' escape '\' | ||
MySQL | 用\将特殊字符转义: select * from 表名 where 列名 like '_\%_' |
注:Access 的模糊查询是 '?','*' ,如 :Select * from 表名 where 列名 like '*b*'
2.1.2 绑定过滤控件
2.1.1 节中已经定义好了数据集参数,如果要实现查询就必须绑定一个控件。点击参数面板,在参数面板「组件设置」处可以看到定义的 name 参数,点击将其添加在参数面板中,根据需要选择一个控件类型,这里我们选择「文本控件」。如下图所示:
2.1.3 设计报表实现过滤
将 ds1 数据集的数据列拖到报表中,设计报表,如下图所示:
2.1.4 效果预览
保存模板,点击「分页预览」,在文本框中输入模糊查询的字符串,也就对应着 name 参数为不同的值,则数据库 SQL 语句就不同,这样就实现了模糊查询。PC 端效果如下图所示:
App 及 HTML5 效果如下图所示:
已完成模板请参见:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Primary\Parameter\模糊查询简单示例.cpt
点击下载模板:模糊查询简单示例.cpt
2.2 模板参数
模板参数 实现数据筛选查询和数据集参数不同,数据集参数是在从数据库中查询数据时就实现了过滤,而模板参数是将数据列添加在单元格中后再过滤,适合内置数据集或者文件数据集使用。
2.2.1 定义模板参数
这里相当于提前定义好一个参数,参数可以是 模板参数、全局参数、系统参数。区别在于全局参数所有模板都可以用,系统参数不用再定义。若你定义了一个全局参数想要实现过滤,或者想要通过系统参数过滤,也可以参考此方法。
定义一个模板参数 name。如下图所示:
2.2.2 绑定过滤控件
2.2.1 节中已经定义好了模板参数,如果要实现查询就必须绑定一个控件。点击参数面板,在参数面板「组件设置」处可以看到定义的 name 参数,点击将其添加在参数面板中,根据需要选择一个控件类型,这里我们选择「文本控件」。如下图所示:
2.2.3 添加过滤条件
新建数据集,SQL 语句为:SELECT * FROM 销量,即默认查询销量表中所有数据。将数据列添加到单元格中,并设置报表样式,如下图所示:
这时默认是所有数据,如果要实现查询,就必须添加过滤条件,双击 A2 单元格,为其添加过滤条件。过滤条件为销售员这一列的值包含参数 name。如下图所示:
这样就实现了过滤,保存模板,点击「分页预览」,在文本框中输入模糊查询的字符串,也就对应着 name 参数为不同的值,则报表过滤条件不同,查询出的数据也就不同,这样就实现了数据模糊查询。如下图所示:
2.2.4 效果预览
保存模板,效果如 2.1.4 节所示。
3. 索引
参考文档 | 应用场景 | 效果图 |
---|---|---|
文本控件模糊查询关键字高亮显示 | 在对报表进行模糊查询的时候,希望查询出来的数据列中,高亮显示模糊关键字。 | |
下拉复选框多值模糊查询 | 希望使用下拉复选框选择多个值,按照每个值去模糊查询 |