日期:2014-05-19  浏览次数:21033 次

一个数据库查询的问题
比如说我有一个学生表
我在查询的时候做了3个文本框,分别是按学号、姓名、入学时间查询
并且每个文本框上面都有一个控制它Enable属性的副选框,就是说如果选中这个副选框,那么它的文本框就可以使用,并且查询条件有它,反之就没有。你可以只按学号、姓名、入学时间中的一项查询,也可以选择两项或3项的交叉查询。
        我是怎么做的:if   学号副选框   被选中,其他两个没被选中……
                                    if   学号和姓名副选框被选种,入学时间没被选中……
        那这么太麻烦了,一共有7种情况,如果在多几条查询条件那不累死了,有没有简单的方法,比如写个函数什么的?!
        我就想找一个简便的方法,并希望大家能给出代码

------解决方案--------------------
在存储过程里处理
我写的 参考下
=======================================================
ALTER PROCEDURE Rp_Employees_Details
(
@ORG_ID VARCHAR(100) ,--机构(必填)
@USER_TITLE VARCHAR(100),--岗位
@USER_ACTIVE varchar(40),--是否在职(1,在职)
@USER_WORK_LIMIT VARCHAR(100),--工作年限
@EDUCATETION CHAR(2),--受教育程度
@age_b varchar(50),--出生日期开始时间
@age_e varchar(50),--出生日期结束时间
@SEX CHAR(2)--性别
)
as

declare @sqlWhere varchar(800),@sql varchar(800)
set @sqlWhere = ' where 1 = 1 '
set @age_e = @age_e + ' 23:59:59 '

if(@ORG_ID <> ' ')
begin
if(@age_b <> ' ' and @age_e <> ' ')
set @sqlWhere = @sqlWhere + ' and USER_BIRTHDAY > = ' + ' ' ' '+@age_b+ ' ' ' '+ ' and USER_BIRTHDAY <= '+ ' ' ' '+@age_e+ ' ' ' '
if(@USER_TITLE <> ' ' and @USER_TITLE <> '-1 ' )
set @sqlWhere = @sqlWhere + ' and USER_TITLE = '+ ' ' ' '+@USER_TITLE+ ' ' ' '
if(@USER_ACTIVE <> ' ' and @USER_ACTIVE <> '-1 ' )
begin
if(@USER_ACTIVE = '01 ')
set @sqlWhere = @sqlWhere + 'and USER_ACTIVE = 1 '
else if(@USER_ACTIVE = '02 ')
set @sqlWhere = @sqlWhere + 'and USER_OUT = 1 '
end
if(@ORG_ID <> '-1 ' )
set @sqlWhere = @sqlWhere + ' and ORG_ID = '+ ' ' ' '+@ORG_ID+ ' ' ' '
if(@USER_WORK_LIMIT <> ' ' and @USER_WORK_LIMIT <> '-1 ' )
set @sqlWhere = @sqlWhere + ' and USER_WORK_LIMIT = '+ ' ' ' '+@USER_WORK_LIMIT+ ' ' ' '
if(@EDUCATETION <> ' ' and @EDUCATETION <> '-1 ' )
set @sqlWhere = @sqlWhere + ' and USER_EDUCATION = '+ ' ' ' '+@EDUCATETION+ ' ' ' '


set @sql = '
select U.*,O.ORG_NAME,CE.CODE_NAME as 文化程度,CD_SEX.*,CS.* from UR_USERS U
left join (select ORG_ID,ORG_NAME from SYS_ORGANIZATION) O on USER_ORG_ID = ORG_ID
left join CD_EDUCATION CE on CE.CODE_VALUE = USER_EDUCATION
left join CD_SX CS on USER_ORIGIN = CS.CODE_VALUE COLLATE Chinese_PRC_CI_AS
left join CD_SEX on U.USER_SEX = CD_SEX.CODE_VALUE COLLATE Chinese_PRC_CI_AS
'
+@sqlWhere
print @sql
exec (@sql)
end

------解决方案--------------------
string strSQL = "select * from students where 1=1 ";

if(chx1.Checked)
strSQL +=string.Format( " and 学号= '{0} ' ",学号)
if(chx2.Checked)
strSQL +=string.Format( " and 姓名= '{0} ' ",姓名)
if(chx3.Checked)
strSQL +=string.Format( " and 入学时间= '{0} ' ",入学时间)

这样可以不考虑7种情况