0

我写了这样的查询:

select * from c_course where c_course.cdesc LIKE CONCAT('%',"science",'%')
OR  c_course.cname LIKE CONCAT('%',"science",'%');
cid     cname      cdesc      sdate         edate
'301', 'physics', 'science', '2013-01-03', '2013-01-06'
'303', 'chemistry', 'science', '2013-01-09', '2013-01-09'
'501', 'science', 'natural science', '2013-01-31', '2013-01-09'

它工作正常。我也使用这样的存储过程编写过:

use lportal;
delimiter //
create procedure pro_search143(IN sname varchar(20))
begin

SET @c = CONCAT('"',sname,'"');

select * from c_course where 

c_course.cdesc LIKE CONCAT('%',c,'%')
OR 
c_course.cname LIKE CONCAT('%',c,'%');

end
//

它正在执行,但是在调用该过程时,它显示如下错误:

呼叫 pro_search143("科学"); c where 子句中的未知列。

任何人都可以修改我的代码并给出解决方案吗?

4

2 回答 2

0

可能是这样的:

 use lportal;
 delimiter //
 create procedure pro_search143(IN sname varchar(20))
 begin

 SET @query = concat('select * 
                      from c_course 
                      where c_course.cdesc LIKE CONCAT(''%'',''',sname,''',''%'') 
                         OR c_course.cname LIKE CONCAT(''%'',''',sname,''',''%'');
                     ');

 PREPARE stmt FROM @query;
 EXECUTE stmt;

 end //

与 :call pro_search143("science")

于 2013-08-31T07:31:03.770 回答
0

您定义了一个变量@c,但您使用c. 你错过了@.

但为什么不只是

select * from c_course 
where cdesc LIKE CONCAT('%',sname,'%')
OR cname LIKE CONCAT('%',sname,'%');

看看你的例子,你甚至可以做

select * from c_course 
where sname in (cdesc, cname)

这比通配符搜索在性能上要好得多。

于 2013-08-31T07:39:13.763 回答