SQL中的条件限制问题(100分)

  • 主题发起人 主题发起人 zm001
  • 开始时间 开始时间
Z

zm001

Unregistered / Unconfirmed
GUEST, unregistred user!
我想根据条件来查询数据库,条件有5个,用SQL的where子句来限制,
如,where (日期 between :riqi1 and riqi2) and (产品类别=:leibie)and
(壳号=:kehao) and (型号规格=:xinghao) and (产品计量单位=:danwei);
再取edit.text的值给变量赋值。
现在的问题是?每个条件输入值有两种情况,all和具体查询值,当一个条件
的edit.text选all时,此条件不限制,where子句里就应该去掉这个条件,
如果判断5个条件组成的各种情况,我就得写2的5次方个where子句,有什么好的办法
处理这个问题?我对sql语句不熟,如果当一个字段条件输入一个特定的值时,如all,
而不起限制作用就好了。
 
var
sqlstr: string;
begin
sqlstr:='select * from aa Where (日期 between :riqi1 and riqi2) ';
if 条件1 then
sqlstr:=sqlstr ' and ..........
if 条件2 then
sqlstr:=sqlstr+' and ..........

明白了吧.
 
同意aerobull
当Edit.Text中不为All时sqlstr=sqlstr+'条件'
with Query1 do
begin
Close;
SQL.Clear;
SQL.Add(sqlstr);
ExecSql;
end;

 
同意上面两位。
当条件为All时就是不以该字段为条件。
 
您提出的问题,关键在于您是将SQL语句直接写在Tquery控件中了,因此不好处理,
在写程序时,应将SQL 语句用字符串拼接的办法先付值给变量,然后再用SQL.add方法将SQL
语句符值到Query控件中,这样您就可以一项一项地判断,具体程序如下:

Query1.close;
Query1.SQL.Clear;
Query1.SQL.Add(sqlstr);
Query1.ExecSql;
 
同意jiangone,字符串拼接更灵活
用STRINGLIST1将
1:日期 between :riqi1 and riqi2)
2:(产品类别=:leibie)
3:(壳号=:kehao)
4:(型号规格=:xinghao)
5:(产品计量单位=:danwei)
存起来,并保持与EDIT顺序的一直,将EDIT放在一个PANEL上
bFirst : boolean;
bFirst := true;
query1.sql.text := 'select * from table1 ';
FOR I=0 TO 4 DO
IF(panel1.controls as tedit).text<>'all' then
begin
if bFirst then
begin
query1.sql.add('where ');
bfirst := false;
end
else
query1.sql.add(' and ');
query1.sql.add(stringlist[i+1]);
query1.prams.astext=(panel1.controls as tedit).text;
end;
query1.execsql;
 
完全同意上面的观点,SQL语句应该动态生成!可以给分了吧!
 
不一定要动态生成,可以这样:
where
((:参数 = 1) and (条件))
or
(:参数 = 0)
这样,当参数为 1 时,你设定的条件就起作用,而不为 1 时,就不起作用
参数的作用相当于一个 checkbox
 
耐心一点,if......
 
谢谢各位,除了连接速度慢,这儿真是个好地方。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部