如何实现模糊查询??

wzhong 2002-12-05 01:40:31
界面上有不确定数目的编辑框,查询时这几个框都有可能输入资料作为查询条件,每一个框允许输入<、>、=、<=、>=等符号,请问如何组合这段sql。
最好能提供详细source
...全文
141 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyhuo 2002-12-06
  • 打赏
  • 举报
回复
我是使用TStringGrid实现的
For i:=1 to SgrdHide.rowcount-1 do
begin
IF SgrdHide.cells[0,i]='' THEN
Continue; //当为空时,跳到下循环
Fsql:=Fsql+SgrdHide.cells[0,i]; //条件累加
Case comSign.Items.IndexOf(SgrdHide.cells[1,i]) of
0: Fsql:=Fsql+'='''+SgrdHide.cells[2,i]+'''';
1: Fsql:=Fsql+'>'''+SgrdHide.cells[2,i]+'''';
2: Fsql:=Fsql+'>='''+SgrdHide.cells[2,i]+'''';
3: Fsql:=Fsql+'<'''+SgrdHide.cells[2,i]+'''';
4: Fsql:=Fsql+'<='''+SgrdHide.cells[2,i]+'''';
5: Fsql:=Fsql+'<>'''+SgrdHide.cells[2,i]+'''';
6: Fsql:=Fsql+' LIKE '''+'%'+SgrdHide.cells[2,i]+'%'+'''';
end;
Case comLink.Items.IndexOf(SgrdHide.cells[3,i]) of
0: Fsql:=Fsql+' AND ';
1: Fsql:=Fsql+' OR ';
end;
IF Pos(SgrdHide.cells[0,i],FieldName)<=0 then //取得要排序的字段
FieldName:=FieldName+SgrdHide.cells[0,i]+','
End;
Delete(Fsql,length(Fsql)-4,4); //删除最后一个连接符号
Delete(FieldName,length(FieldName),1); //删除最后一个逗号
Adoquery.close;
if Fsql<>'' then //当FSQL不为空时
Begin
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0) AND //当涵有WHERE 和不涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then
Begin
Adoquery.Sql.text:=FDefaultSQL+' AND '+Fsql+' Order by '+FieldName;
end
Else
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0) and //当涵有WHERE 和涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then
Begin
NewSql:=FDefaultSQL;
insert(' AND '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL)));
Adoquery.Sql.text:=NewSql+' Order by '+FieldName;
end
ELSE
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0) AND //当不涵有WHERE 和不涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then
Begin
Adoquery.Sql.text:=FDefaultSQL+' WHERE '+Fsql+' Order by '+FieldName;
end
ELSE
if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0) AND //当不有WHERE 和涵有GROUP BY 时
(Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then
Begin
NewSql:=FDefaultSQL;
insert(' Where '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL)));
AdoQuery.Sql.text:=NewSql+' Order by '+FieldName;
end ;
END
ELSE
Adoquery.Sql.text:=FoldSql;
Try
Adoquery.open;
Except
Showmessage('查找出错: '+AdoQuery.sql.text);
end;
if AdoQuery.Filtered Then
AdoQuery.Filtered:=false;
tommy_linux 2002-12-05
  • 打赏
  • 举报
回复
var
sign:string;
fstr:string;
begin
case ComboBox1.ItemIndex of
0: sign:='=';
1: sign:='>';
2: sign:='<';
3: sign:=' like ';
4: sign:='<>';
end;
case ComboBox1.ItemIndex of
0,4:fstr:='select * from tabel1 where(%s%s%s) order by %s';
19: fstr:='select * from tabel1 where(%s%s#%s#) order by %s';
else fstr:='select * from tabel1 where(%s%s''%s'') order by %s';
end;
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add(Format(fstr,[ComboBox1.Text,sign,Edit1.Text,ComboBox1.Text]));
Prepared;
Open;
end;
CloneCenter 2002-12-05
  • 打赏
  • 举报
回复
想怎么组合就怎么组合。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧