比如有一张表,其表结构为: create table abc (no char(4), --编号 name char(8), --名称 age number --年龄 )
现在我想实现这样的查询: 查询出 编号 包含 '100' 并且 名称 等于'1' 或 '2' 并且 年龄 等于10或11的记录
实现方法有两种: 1、通过Sql语句: AdoQuery1.sql.text:='select * from abc where no like ''%100% '' and (name=''1'' or name=''2'') and (age=10 or age=11)'; AdoQuery1.open; 这个没有问题,很容易实现;
2、通过过滤实现: 第一步,打开所有记录: AdoQuery1.Filtered:=true; AdoQuery1.sql.text:='select * from abc'; AdoQuery1.open;
第二步,开始过滤,这里很关键,如果我们这样写: AdoQuery1.Filter:='no like ''%100%'' and (name=''1'' or name=''2'') and (age=10 or age=11)'; 结果会报错,电脑提示参数不对; 只能这样写: AdoQuery1.Filter:= ' (no like ''%100%'' or name=''1'' or age=10) and (no like ''%100%'' or name=''1'' or age=11) and (no like ''%100%'' or name=''2'' or age=10) and (no like ''%100%'' or name=''2'' or age=11) ';
这有点类似于小学乘法分配律, 上面这个例子与下面这个其实是一回事: a*(b+c)*(d+e)=(a+b+d)*(a+b+e)*(a+c+d)*(a+c+e)
也就是说对于sql 的where 条件,两种写法都可以,对于Filter,只能写后面这种方法, 但是我们在写过滤条件的时候,写成 a*(b+c)*(d+e)这种形式比(a+b+d)*(a+b+e)*(a+c+d)*(a+c+e)要相对容易实现。
如果我们可以通过一个字符串处理函数把 a*(b+c)*(d+e) 变成 (a+b+d)*(a+b+e)*(a+c+d)*(a+c+e);
这样我们就可以不受限制的使用过滤功能了;
这个算法好像在编译原理或数据结构课程里介绍过,但是不清楚具体如何通过delphi实现。
希望对此熟悉的朋友帮帮忙!