回 帖 发 新 帖 刷新版面

主题:请教这种不定条件数的存储过程写法!!!

如:

@scode varchar(10)
......

.....where 学生代码=(case when @scode='' then 'is not null' else @scode end)
.....

注:当@scode参数有数值时查询学生代码为此值的记录,否则查询所有学生代码(为了简便我这里只列了一个查询条件,事实上这里有8个类似条件)

我试过当@scode='0001'时可查到学生代码=0001的记录,但当@scode=''时却没有记录显示.

请各位指点!!!

回复列表 (共8个回复)

沙发

if exists (select * from where 学生代码= @scode)......
else ...

板凳

没有查到的原因是因为你的where 学生代码=(case when @scode='' then 'is not null' else @scode end) 后面的"学生代码=" 假如是变量可以是"学生代码=value"而如果是'' 的话,你可以想像啦!

3 楼

谢谢二楼的回贴!!

说明: 我这里的@scode已经是变量了(在存储过程头部已经定义了)

4 楼

我知道是变量,我的意思是说,如果你传入的是'',你可以把你case后面的值取出来,看一下你的sql语句对不对,是不是会成这样
select * from tablename where 学生代码='is not null'

create  proc Ptest
@tid varchar(10)
as
if @tid=''
select * from 表名 where 字段 is not null
else
select * from 表名 where 字段=@tid

5 楼

谢谢gggmmtddir朋友对本贴的关注和回复!!!!!


if @tid=''
...
else
...
确实可行,但因为我的SQL语句有8000多字节,并且where后面的条件也有20几个,如果用if ... else ...可以想象那个复杂程度.
为了减少语句的重复,和维护方便,我一直在探索在where后面用case条件语句来实现不定条件数的SQL语句写法.

为了说明我的意思,我下面用"准SQL语句"书写部分如下:
.....(8000个字符略去) where (如果"学生代码"为空则查所有学生代码,否则查指定的学生代码) and (如果"学生藉贯"为空则查所有学生藉贯,否则查指定的学生藉贯) and (如果"学生年龄"为空则查所有学生年龄,否则查指定的学生年龄) and (如果"语文成绩"为空则查所有语文成绩,否则查指定的语文成绩) and ......

按期数学的组合法,仅以上条件若拆分为if语句则需要16个if语句才能实现.

愿听各位网友的高见!!

6 楼

如果你用case我觉得 你的where 条件后面跟的是like
create proc Ptest
@eid varchar(10)
as
select * from 表名 where 字段 like(case 
                    when @eid='' then '%' 
                    else @eid
                end)

7 楼

非常谢谢gggmmtddir的回贴!!!

没错,用like确实可以,但是like是模糊查询用的,我这里要求的是精确查询,所以还是不能达到预期效果,不过已经比较按近了.

继续,兄弟,谢谢!

8 楼

有条件就传条件,无条件 传个 1=1 不就行了

我来回复

您尚未登录,请登录后再回复。点此登录或注册