| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 766 人关注过本帖
标题:急!!!寻求类似小学乘法分配律的算法(解决AdoDataSet过滤条件功能不够的 ...
只看楼主 加入收藏
qingyun
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-7-6
收藏
 问题点数:0 回复次数:1 
急!!!寻求类似小学乘法分配律的算法(解决AdoDataSet过滤条件功能不够的缺陷)

比如有一张表,其表结构为: 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实现。

希望对此熟悉的朋友帮帮忙!

搜索更多相关主题的帖子: 乘法 AdoDataSet 算法 缺陷 小学 
2005-10-16 12:24
qingyun
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2005-7-6
收藏
得分:0 
2005-10-16 12:25
快速回复:急!!!寻求类似小学乘法分配律的算法(解决AdoDataSet过滤条件功能不 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014113 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved