【挑战高手:忽略空格的查询,有没有人能做到,先摆 20 分,解决了一定给 200,说话算数】
我的某个表的某个字段有如下数据:
001 02 AB02 123
00 034 RS F033
....
是产品的型号, 其中在不确定的位置有空格, 现在客户的要求是要能够输入任意连着的数字或字母检索出来相关的产品, 比如:
输入 '2A' 要求能够检索出 第一条记录。 简单一点也就是忽略空格的查询。
我很想用 where '%' + replace(xxx, ' ', '') + '%' like '%' + replace(yyy, ' ', '') + '%'
这样的语句来查询, 可是 Access 中似乎没有这个 replace 函数。
我是用 delphi 来操作这个数据库的, 如果谁能够告诉我如何解决这个问题, 再多的分也可以。 谢谢!
如果是告诉我 access 没法做到的就不用回复了。
注意,空格的位置和数目是不确定的, 所以如果想告诉我寻找某种规律也不用说了。
问题点数:100、回复次数:18Top
1 楼alexzhang00(三角猫)回复于 2004-09-04 17:54:59 得分 0
ACCESS 支持 REPALCE 啊,我这里是 ACCESS 2003,支持的
DELPHI的代码:
var sql: string;
begin
sql = 'SELECT * FROM [tablename] WHERE REPLACE(field_name, " ", "") LIKE ''%' + trim(传入的条件) + '%''';
adodb_query.sql.text = sql;
adodb_query.open;
//.....
end;Top
2 楼inelm(木野狐)回复于 2004-09-04 17:57:01 得分 0
猫猫, 碰到你了,呵呵,谢谢!
不过这个没解决啊, 我是要把 mdb 文件刻到光盘上的, 客户的机器不一定有 2003 啊。Top
3 楼alexzhang00(三角猫)回复于 2004-09-04 17:58:30 得分 0
不好意思,漏了: 是
sql := 'SELECT * FROM [tablename] WHERE REPLACE(field_name, " ", "") LIKE ''%' + trim(传入的条件) + '%''';
Access 2000 ,我没试过,我想应该是支持的Top
4 楼alexzhang00(三角猫)回复于 2004-09-04 17:59:30 得分 0
没关系啊, 和平常的程序一样的, 只要用户机子装了 JET 4 驱动就OK了Top
5 楼inelm(木野狐)回复于 2004-09-04 18:00:14 得分 0
Access 2000 不支持,我没试成功。唉,只好再看看其他人有没有办法了..Top
6 楼inelm(木野狐)回复于 2004-09-04 18:00:50 得分 0
就是因为没法用 replace 函数才来这里问的。Top
7 楼JohnShen(因果网)回复于 2004-09-04 18:15:17 得分 0
这是基本函数啊,2000也应该支持的,是不是你的语句写的有问题?
where '%' + replace(xxx, ' ', '') + '%' like '%' + replace(yyy, ' ', '') + '%'
改成
WHERE REPLACE(field_name, " ", "") LIKE ''%' + trim(传入的条件) + '%'''
再试一下Top
8 楼alexzhang00(三角猫)回复于 2004-09-04 18:33:45 得分 0
我试了一下,确实不支持, 而起ACCESS 也不支持正则
我有个方法, 不过效率就低了,如果应付客户做DEMO应该是可以用的,
sql := 'SELECT * FROM [tablename]';
ado_query.sql.text = sql;
ado_query.open;
while not ado_query.eof do
begin
if pos(trim(传入的条件变量), AnsiReplaceStr(ado_query.fieldbyname('field_name').value, ' ', '')) > 0 then
begin
// 输出此条记录
end
ado_query.next
end;
ado_query.close;
end;Top
9 楼alexzhang00(三角猫)回复于 2004-09-04 18:35:01 得分 0
在 USES 里引用 strUtilsTop
10 楼alexzhang00(三角猫)回复于 2004-09-04 18:37:16 得分 0
ado_query.sql.text := sql;
好长时间不用DELPHI, 语法有些生疏了Top
11 楼inelm(木野狐)回复于 2004-09-04 20:12:25 得分 0
三角猫, 这样循环遍历也是可以的, 可是我要做的是将得到的记录集绑定到 DBGridPlus, 一个类似于 DBGrid 的控件, 有办法吗?Top
12 楼alexzhang00(三角猫)回复于 2004-09-04 21:56:45 得分 80
简接实现:
var
id_list: string;
begin
sql := 'SELECT * FROM [tablename]';
ado_query.sql.text := sql;
ado_query.open;
while not ado_query.eof do
begin
if pos(trim(传入的条件变量), AnsiReplaceStr(ado_query.fieldbyname('field_name').value, ' ', '')) > 0 then
begin
// 记录唯一字段
id_list := id_list + ',' + inttostr(ado_query.fieldbyname('id').value);
end
ado_query.next
end;
ado_query.close;
delete(id_list, 1, 1);
id_list := '(' + id_list + ')';
sql = 'SELECT * FROM [tablename] WHERE id IN ' + id_list;
ado_query.sql.text = sql;
ado_query.open;
// 把 ADO_QUERY 绑定到 DBGRIDPLUS
end;
Top
13 楼inelm(木野狐)回复于 2004-09-05 12:02:38 得分 0
太感谢你了! 我试试再说, 不过担心这样会有个问题, 就是记录如果极多的话, 这样组合的 sql 可能会超出 ado 的限制, 不知道会不会。Top
14 楼alexzhang00(三角猫)回复于 2004-09-05 14:56:09 得分 0
不会的, ADO 的 SQL 的字符串长度理论上是没有限制的, 在2G以内吧
如果一行超过 255 的话, 就换行,采用
adoquery.sql := adoquery.sql + str1;
adoquery.sql := adoquery.sql + str2;Top
15 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2004-09-05 17:22:25 得分 20
不会的, ADO 的 SQL 的字符串长度理论上是没有限制的, 在2G以内吧-------------谁告诉你的?微软的资料么?Top
16 楼alexzhang00(三角猫)回复于 2004-09-05 17:28:08 得分 0
不是,好像从 BORLAND 看到的,具体哪里忘记了Top
17 楼alexzhang00(三角猫)回复于 2004-09-05 18:01:11 得分 0
可能是我记错了, 我说的可能是 STRING 类型吧。
ADO的有多长我搞不清, 我最多只用过1000个左右的字符Top
18 楼inelm(木野狐)回复于 2004-09-05 18:27:01 得分 0
我先按照你这个方法做好了, 可是担心以后会有问题..
再等等,看有没有更好的办法。
changechange 兄也请多指教,谢谢!Top
相关问题
- 数据流图的问题!分不够可以加到300,说话算数!
- 说话算数!请白菜哥哥把我仅剩下的100也拿走吧!!
- 远程 解决问题后 即可得到2Q币 说话算数
- 怎么改变的按钮等控件的背景颜色??50分!!!我说话算数
- 给一位准备学asp的初学者 一点点帮助!!!(给分 说话算数)
- 600分的WinSock问题!!想做下个月专家榜的第一吗???说话算数肯定给!
- 谁要是告诉我狙击手的故事的网址,这点分全给,说话算数!!!
- 大家快来拿分,只要能骂,都有分,说话算数。要知详情,请进。。。。
- 大家好!我遇到一个问题,大家来看看,好吗?一定结贴,说话算数的
- 大家对在asp.net中用owc 组件发表一下看法吧!!!来者有分!!!说话算数.




