如何在SQL的IN语句中用参数(50分)

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

zhshf

Unregistered / Unconfirmed
GUEST, unregistred user!
select * from a
where a.code in (:codes)

参数如何赋值?
 
sql.add('select * from a');
sql.add('where a.code=:codes');
parambyname('codes').asstring:=值;
 
sql.add('select * from a');
sql.add('where a.code in :codes');
parambyname('codes').asstring:=值;

------or

sql.add('select * from a');
sql.add('where a.code in'+''codes'');
 
codes 设为一个用 , 相隔的字符串行不行?
 
只要数据类型匹配,怎么写都可以;-)
 
to rixin:
第一种方法:我试了不行;
第二种方法:我想用参数。
to g622:
什么意思?
to xixi12359:
我什么怎么写都不可以?:-(
 
try this one:

sql.add('select * from a');
sql.add('where a.code in '+''''codes''''');
//codes為變量
 
to rixin:
我只是想知道参数怎样赋值。
 
query.parambyname('codes').asstring:=值;
不行吗?
把源码贴出来看看
 
估计你的参数不少,试一试
select * from a
where a.code=:codes1 or :codes2 or :codes3
query.parambyname('codes1').asstring:=值1;
query.parambyname('codes2').asstring:=值2;
query.parambyname('codes3').asstring:=值3;

 
我在QUERY1中写入
select * from a
where a.code in (:codes)
参数codes的类型是string,字段code的类型是varchar

to xiaoxin:
你的方法是可以,只是我想知道参数在in语句里如何赋值。
 
补充一点:
参数只赋一个值时可以,多个时不行。
如:query1.parambyname('codes').asstring:='A10';
//可以执行,能查出数据
query1.parambyname('codes').asstring:='''A10'',''A20''';
//可以执行,但查不出数据
query1.parambyname('codes').asstring:='A10'',''A20';
//可以执行,但查不出数据
 
有二种方法:
1、如果IN后的CODES集合是从另一个表中产生,可以将
IN后的参数改为另一个SELECT语句,这样,参数
就可以是单个变量,如SELECT * FROM A WHERE
CODE IN (SELECT CODE FROM B WHERE XXX=:YYY)。
2、如果CODES不是从数据表中产生,可以动态生产UNION,
如:SELECT * FROM A WHERE CODE=:XXX
UNION
SELECT * FROM A WHERE CODE=:YYY
再给XXX或YYY赋值。
 
可能是我的问题没说清楚,我有别的办法解决这个问题,比如动态写SQL,
但我只是想知道在IN语句中的参数如何赋值。
 
这个问题的根本原因在于Delphi的params的赋值方法,
Asstring方法会自动为参数值加上引号,也就是说,
params的赋值并不是简单字符串替换,
因此如果你的in语句只有一个值,就会正确,值多了就不正确了。

还有很多人希望这样用:
select * from :tablename where ...
parambyname('tablename').asstring:='aaa';
由于同样的原因,也是会出错的。

因此,答案就是不能这样做。
 
不能通过 Param.AsString 方法赋值,直接生成 SQL 语句吧:
S := '';
S := S + ',''A1''';
S := S + ',''A2''';
...
// 上面也可以用循环实现

Delete(S,1,1); // 删除第一个逗号
Query.SQL.Add('select * from a where a.code in ('+S+')');

See it ?

From: BaKuBaKu
 
基本同意温柔一刀。

SQL的IN语句普通如下
select * from a where a.code in ("strX","strY",...)

如果要用
select * from a where a.code in (:codes)
进行参数传递,则 :codes = '"strX","strY",...';

这样 SQL 语句变为
select * from a where a.code in ('"strX","strY",...')
(注意 单引号 和 双引号 的使用技巧)

显然,a.code 和 '"strX","strY",...' 是不能相配的。

>>如果你的in语句只有一个值,就会正确。
可是此时就不必有 in 语句了。

<font color=red>非要用参数传递,可考虑如下写法:</font>
select * from a
where a.code in (:codes1,:codes2,...)

parambyname('codes1').asstring:=......
......
但这样用起来很别扭,除非参数的数量是固定的。

所以动态写 SQL 是较好的一种方法。
 
接受答案了.
 
后退
顶部