第一个问题,急!(100分)

  • 主题发起人 主题发起人 代彬
  • 开始时间 开始时间

代彬

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在正在做一个复杂查询,后台数据库是Paradox,前台开发工具是DELPHI5。查询分为
若干项,如按姓名关键字、年龄、性别、学历、职称和具体单位的关键字模糊查询等。
允许用户选择任意的查询多项目,没有选择的查询项目的Enabled为FALSE,如何用最少的
SQL语句设计查询结构,不要告诉我在执行SQL之前先进行IF判断,因为这种方法对于少于3
个查询项目还行,多了简直太繁了,如果有六个查询条件,你可以想想用户的查询方案有
多少种组合,要进行多少的判断。
请各位高手不吝赐教,给出解决方案。这里有100块大洋请拿去!
 
用Like就可以了啊
 
这样做嘛:
var
sqlstring:string;
begin
if edit1.text<>'' then //姓名不为空
sqlstring:=' xm like '''+edit1.text+'''';
if edit2.text<>'' then //年龄不为空
begin
if sqlstring<>'' then
sqlstring:=sqlstring+' and nl like '''+edit2.text+''''
else
sqlstring:=' nl like '''+edit2.text+'''';
end;
if edit3.text<>'' then //性别不为空
begin
if sqlstring<>'' then
sqlstring:=sqlstring+' and xb like '''+edit3.text+''''
else
sqlstring:=' xb like '''+edit3.text+'''';
end;
if edit4.text<>'' then //学历不为空
begin
if sqlstring<>'' then
sqlstring:=sqlstring+' and xl like '''+edit4.text+''''
else
sqlstring:=' xl like '''+edit4.text+'''';
end;
if edit5.text<>'' then //职称不为空
begin
if sqlstring<>'' then
sqlstring:=sqlstring+' and zc like '''+edit5.text+''''
else
sqlstring:=' zc like '''+edit5.text+'''';
end;
if edit6.text<>'' then //单位不为空
begin
if sqlstring<>'' then
sqlstring:=sqlstring+' and dw like '''+edit6.text+''''
else
sqlstring:=' dw like '''+edit6.text+'''';
end;

if sqlstring<>'' then
begin
with query1 do
begin
close;
sql.clear;
sql.add('select * from table1 where ');
sql.add(sqlstring);
open;
end;
end
else
begin
with query1 do
begin
close;
sql.clear;
sql.add('select * from table1 ');
open;
end;
end;

end;
 
如果查询多的话,动态建一个临时表,将查询的字段、关系填入,
然后用Grid由用户进行设置,最后在临时表中循环拼写SQL。
可以做通用查询。
 
fstao 的方法是最常用的,赞成!
 
其实用模糊查询一句就可以了啊,就是djdsz的like,
'select * from 表名 where 字段1 like'+edit1.text+'and 字段2 like'+edit2.text+.......
就算是空的也不要紧
 
同意doud,很通用的。
 
不用临时表也可以。
不过建议你别用ENABLED的方法。
用二个tCOMBOBOX和一个TEDIT,
在第一个TCOMBOBOX中将各个要查询的项目在其中列出。
在第二个TCOMBOBOX中列出各个查询的比较符,如<,>,LIKE 等等。
TEDIT中有用户输入查询条件。
再放三个按钮,分别代表或、与、非的关系。
当用户选择完一个条件后,在一个变量中存入这个条件,然后如果用户要增加第二个条件,
则必须要点击三个按牛中的一个,在重复即可。关于条件的记录,在哪个变量中做字符累加
即可,这个我想不会太难。
好,解释到此为止。
 
与楼上同
 
fstao的问题给我提供了一个思路,但他的答案不太完整,我的这种情况不同了。
首先是他的代码本身忽略了对“AND”的处理,还是要用布尔变量来处理组合的。
还有我的年龄使用TCOMBOBOX选择的,如“25岁以下”、“25-35”、“35以上”等。而数据库
中对应的字段(出生日期)是年月日的日期型,所有存在一个内嵌在SQL(PARADOX)中的
年份提取函数问题,我用“Sql('(Year(now)-Year(出生日期)) between 25 and 35')怎么不
行呢?
 
后退
顶部