模糊匹配问题

lanowen 2008-12-19 06:23:59
请先看下面的代码,pbscript--功能是:模糊查询,查询符合条件的值。表字段为:xsdm varchar(2),xsqc varchar(20),xsjc varchar(20)假如表中有一条记录是
11 中国语言文学系 中文系
现在我的查询条件是'%中%',那么结果应该会返回 中国语言文学系,但是他没有返回,请问哪里错了?
string mc
string dm0,qc0,jc0
int n,n_msgb
mc=trim(sle_mc.text)
if len(mc)=0 then
messagebox("系所查询","请输入查询条件(名称)!")
sle_mc.setfocus()
return
end if
mc="%"+mc+"%"
//mc='%'+mc+'%' //我也试了,也不对
//messagebox("oooo",mc)
declare cn_xsdm cursor for
select xsdm,xsqc,xsjc
from t_xsdm
where xsqc like :mc or xsjc like :mc; //我认为这里错了,但是不知道怎么改?
//where xsqc='中国语言文学系';

open cn_xsdm;
n=0;
do while true
fetch cn_xsdm into :dm0,:qc0,:jc0;

if sqlca.sqlcode=100 then
//messagebox("jj",sqlca.sqlerrtext)
if n=0 then
messagebox("系所查询","没有符合条件的系所记录!")
else
messagebox("系所查询","符合条件的系所记录已经查询完毕!")
end if
exit
end if
sle_dm0.text=dm0
sle_qc0.text=qc0
sle_jc0.text=jc0
n=n+1
messagebox("系所查询","这是第"+string(n)+"条符合条件的系所记录!")
n_msgb=messagebox("系所查询","继续显示其他符合条件的系所记录吗?",Question!,YesNo!,1)
if(n_msgb=2) then
exit
end if
loop
close cn_xsdm;
sle_dm0.text=""
sle_qc0.text=""
sle_jc0.text=""
sle_mc.text=""
sle_mc.setfocus()
...全文
198 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yingmu 2009-02-13
  • 打赏
  • 举报
回复
mc="%"+mc+"%"
//mc='%'+mc+'%'
这两句都行应该,不要再拼上一对引号了
where xsqc like :mc or xsjc like :mc
这里应该也没什么问题感觉

建议在查询分析器或pb的数据库管理器里先执行一下试试
hemhem 2008-12-25
  • 打赏
  • 举报
回复
把MC trim一下,或你把游标换成DATASTORE再通过FILTER 或 SORT + FIND 来实现
按你上面的代码估计是MC没TRIM的缘故
softvery 2008-12-25
  • 打赏
  • 举报
回复
首先
declare cn_xsdm cursor for
select xsdm,xsqc,xsjc
from t_xsdm
where xsqc like :mc or xsjc like :mc;
这种用法可定是没有错误的

将 select xsdm,xsqc,xsjc from t_xsdm where xsqc like '%中%' or xsjc like '%中%' 贴到查询分析器中执行以下看看结果

另外建议使用如下语法较为清晰:

open cn_xsdm;
n=0;
fetch cn_xsdm into :dm0,:qc0,:jc0;
do while sqlca.sqlcode=0
sle_dm0.text=dm0
sle_qc0.text=qc0
sle_jc0.text=jc0
n++
if messagebox("系所查询","这是第"+string(n)+"条符合条件的系所记录,继续显示其他符合条件的系所记录吗?",Question!,YesNo!,1) =2 then exit
fetch cn_xsdm into :dm0,:qc0,:jc0;
loop
close cn_xsdm;
if n=0 then
messagebox("系所查询","没有符合条件的系所记录!")
else
messagebox("系所查询","符合条件的系所记录已经查询完毕!")
end if

lanowen 2008-12-25
  • 打赏
  • 举报
回复
like '%" + mc + "%' or xsjc like '%" + mc + "%'"
我不知道你的那些引号是什么意思?
leef_zh 2008-12-25
  • 打赏
  • 举报
回复
把这里改成
mc="'%"+mc+"%'"

我感觉是少了一对引号
dyf0130 2008-12-25
  • 打赏
  • 举报
回复
PB 里说里游标比使用DW慢
而且 DW操作起来也简单
做1个通用的根据SQL字符串创建DW的函数不就结了
Chenghj 2008-12-25
  • 打赏
  • 举报
回复
上面缺定义:

datastore ds1

取值:

sle_dm0.text = ds1.getitemstring(i,'xsdm')
sle_qc0.text = ds1.getitemstring(i,'xsqc')
sle_jc0.text = ds1.getitemstring(i,'xsj')

Chenghj 2008-12-25
  • 打赏
  • 举报
回复
不用游标,用datastore,肯定没问题.
string ls_sql,ls_syntax,ls_error
ds1 = create datastore
ls_sql = "select xsdm,xsqc,xsjc from t_xsdm where xsqc like '" + mc + "' or xsjc like '" + mc + "' "
ls_syntax = sqlca.syntaxfromsql(ls_sql,'',ls_error)
if len(ls_error) > 0 then
messagebox('错误',ls_error)
disconnect using sqlca;
DESTROY sqlca;
return
end if
ds1.create(ls_syntax,ls_error)
if len(ls_error) > 0 then
messagebox('错误',ls_error)
disconnect using sqlca;
DESTROY sqlca;
return
end if
ds1.settransobject(sqlca)
n = ds1.retrieve()
if n=0 then
messagebox("系所查询","没有符合条件的系所记录!")
return
end if
for
i = 1 to n
.....
.....

next
dawugui 2008-12-22
  • 打赏
  • 举报
回复
--把你那段油标换为动态的试试

string ls_sql
ls_sql = "select xsdm,xsqc,xsjc from t_xsdm where xsqc like '%" + mc + "%' or xsjc like '%" + mc + "%'"
DECLARE my_cursor1 DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM :is_sql using sqlca;
OPEN DYNAMIC my_cursor1 ;
FETCH my_cursor1 INTO :dm0,:qc0,:jc0;
CLOSE my_cursor1 ;
jjoulejcc 2008-12-22
  • 打赏
  • 举报
回复
mc="%"+mc+"%"
改成
mc = "'%" + mc + "%'"
字符串的拼接问题
lionkings 2008-12-19
  • 打赏
  • 举报
回复
where xsqc like :mc or xsjc like :mc; //我认为这里错了,但是不知道怎么改?

----------------
where xsqc like '%' + :mc + '%' or xsjc like '%' + :mc + '%' ;
lanowen 2008-12-19
  • 打赏
  • 举报
回复
我改了,但是还是一样,不对
liubocy 2008-12-19
  • 打赏
  • 举报
回复
where (xsqc like :mc) or (xsjc like :mc);//我认为这里错了,但是不知道怎么改?

743

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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