关于SQL语句的参数,该怎么做?(50分)

  • 主题发起人 主题发起人 L.Ming
  • 开始时间 开始时间
L

L.Ming

Unregistered / Unconfirmed
GUEST, unregistred user!
本写一个查询的过程,但是因为条件太多,用DELPHI做SQL语句给合太麻烦,也太容易出错,因为情况太多,参数的个数也不定.想这样写一条SQL语句,不知道该怎么实现
SELECT * FROM T_SIGN
WHERE A = :A AND B = :B AND C = :C
三个参数中,如果用户输入用了值,那么使用用户的给的值,如果没有,则默认为所有的数据都符合,例如:如果A参数用户没有给出值,那么查询的结果和
SELECT * FROM T_SIGN
WHERE B = :B AND C = :C 相当.
实际上我想问的就是在兼顾效率的情况下,有没有一个ALL这样的参数的?
 
你使用delphi生成sql条件就可以。
比如用户输入条件A到edit1,
你可以这样处理
if edit1.text=''then
SELECT * FROM T_SIGN WHERE B = :B AND C = :C
else
SELECT * FROM T_SIGN
WHERE A = :A AND B = :B AND C = :C
 
var a,b,c,ResultStr:string;
HasCondition,HasBefore:boolean;
begin
HasCondition:=False;
HasBefore:=False;
a:='';
b:='';
c:='';
Result:='';
if EditA.text<>'' then
begin
HasCondition:=True;
HasBefore:=True;
a:=' A='+EditA.Text';
end;
if EditB.text<>'' then
begin
HasCondition:=True;
if HasBefore then
b:=' and '
else
HasBefore:=True;
b:=b+' B='+EditB.Text';
end;
if EditC.text<>'' then
begin
HasCondition:=True;
if HasBefore then
c:=' and '
else
HasBefore:=True;
c:=c+' B='+EditB.Text';
end;
if HasCondition then
ResultStr:=' Where '+a+b+c;
ADOQuery.sql.clear
ADOQuery.sql.add('SELECT * FROM T_SIGN');
ADQQuery.sql.add(ResultStr);
ADOQuery.Open;
end;
 
to zywcd,一条大鱼:你们的答案不太合我意,因为我现在用的就是大致这样.你们不会以为只有三个参数吧?我的语句如果所有参数都选齐,有好几十个,而且日期,字符串,数字各位类型的字段都有,组合出来的语句有几十行,我自己看得都眼累,我只是想更清晰一点.
 
直接一点吧,用存储过程,有没有高手可以解决?
 
ADOQuery.sql.clear
ADOQuery.sql.add('SELECT * FROM T_SIGN where 1=1');
if trim(edit1.text)<>'' then
ADQQuery.sql.add(' and a=:a');
if trim(edit2.text)<>'' then
ADQQuery.sql.add(' and b=:b');
if trim(edit3.text)<>'' then
ADQQuery.sql.add(' and c=:c');
ADOQuery.Open;
 
你以为如果只有三个条件我会这么写给你啊
6行可以搞定的东西我用几十行来写,如果那样,那我还真的是笨蛋

我给你的就是未知个参数(0-n个)的思路,要不我设这么多的变量做什么喔
当然,a,b,c三个变量可以不要,算法改一下就OK了
但有多少个条件就需要多少个if,这点毋庸置疑
 
按你的想法的话!要做的就是必须在前台判断参数值!
其他办法更麻烦!
 
用like '%字段%', 为空的时候就查所有的
 
to d5love:有点像你所说的,但用like只能用于字符串型的,那么数值型的呢?日期型的呢?怎么解决这个?
to 一条大鱼:先说声对不起,我可以语气有点不适当.我现在用的方式就是你的方式,但是使用过程中,我觉得有点乱,现在回到看以前写的代码,因为变量太多,条件太多,自己看得都有点糊涂,所以才有想改代码的念头.
 
select * from abc where a like :a and b like :b and................
Parameters.ParamByName('a').Value := '%' + Trim(edt1.Text) + '%';(字符)
Parameters.ParamByName('b').Value := '%' + strtoint(edt1.Text) + '%';(数值)
等等等............................
 
感觉可以用.asstring,强制将所有字段转换成字符型,然后用like,你可以试验一下哦。
 
多人接受答案了。
 
后退
顶部