多条件查询SQL语句

今天遇到个问题:有个模糊查询,但是同时可能有多个条件,当然其中有的条件可能是空的.

开始的时候很自以为是的直接将几个查询条件用and连接了起来,结果在程序中一调用,根本查不到结果...

于是开始想到了空值的问题.

如果有的条件为空,怎么办呢?如何修改最终的查询语句?

1.对条件进行空值判断;

2.进行查询语句的字符串拼接.

基本信息表结构如下:

 

create   table  T_INFOCODE_NATURAL
(
 CDATE        
datetime   not   null ,     -- 出厂时间
 FAC_NAME      varchar ( 50 not   null ,     -- 发货厂家
 BATTERY_TYPE     varchar ( 20 ),         -- 电池型号
 SEND_TYPE     varchar ( 20 ),         -- 发货类型
 SEND_NUM     int ,             -- 检测数量
 MAKE_MODE     varchar ( 20 ),         -- 制作方式
 PRODUCE_MODE     varchar ( 20 ),         -- 生产方式
 BATTERY_NUM     int ,             -- 电池组数量
  [ YEAR ]          char ( 4 ),         --
  [ MONTH ]      char ( 2 ),         --
 TDATE         datetime ,         -- 日期
 SEND_RULE     varchar ( 50 ),         -- 发货规则
 SEND_CODE     varchar ( 12 ),         -- 发货组编号
 BATTERY_SORT     varchar ( 20 ),         -- 电池类别(新添加)
 PAGENUM     varchar ( 12 not   null ,     -- 条码号
 FITTING_CODE     varchar ( 12 ),         -- 装配号
 LINE_CODE     varchar ( 12 ),         -- 生产机号
 FLAG         char ( 1 ),         -- 是否放行
 REMARK         varchar ( 200 ),         -- 备注
 OTHER         varchar ( 50 ),         -- 其他
 BLANK_COL     varchar ( 50 ),         -- 空白列
)

 存储过程语句:

 


-- 存储过程,根据CDATE,FAC_NAME,BATTERY_TYPE,MAKE_MODE,PRODUCE_MODE,
-- YEAR,MONTH,TDATE,PAGENUM几个字段来查询

create proc pr_select_Natural
(
 @CDATE     datetime,
 @FAC_NAME    varchar(
50 ),
 @BATTERY_TYPE    varchar(
20 ),
 @MAKE_MODE    varchar(
20 ),
 @PRODUCE_MODE    varchar(
20 ),
 @YEAR        
char ( 4 ),
 @MONTH        
char ( 2 ),
 @TDATE        datetime,
 @PAGENUM    varchar(
12 )
)
as
declare @strCDATE varchar(
100 )
declare @strFAC_NAME varchar(
100 )
declare @strBATTERY_TYPE varchar(
100 )
declare @strMAKE_MODE varchar(
100 )
declare @strPRODUCE_MODE varchar(
100 )
declare @strYEAR varchar(
100 )
declare @strMONTH varchar(
100 )
declare @strTDATE varchar(
100 )
declare @strPAGENUM varchar(
100 )
declare @strMAIN varchar(
500 )

set  @strCDATE  =   ' CDATE = @CDATE and  '
set  @strFAC_NAME  =   ' FAC_NAME like  '' % '' +@FAC_NAME+ '' % ''  and  '
set  @strBATTERY_TYPE  =   ' BATTERY_TYPE like  '' % '' +@BATTERY_TYPE+ '' % ''  and  '
set  @strMAKE_MODE  =   ' MAKE_MODE like  '' % '' +@MAKE_MODE+ '' % ''  and  '
set  @strPRODUCE_MODE  =   ' PRODUCE_MODE like  '' % '' +@PRODUCE_MODE+ '' % ''  and  '
set  @strYEAR  =   ' YEAR like  '' % '' +@YEAR+ '' % ''  and  '
set  @strMONTH  =   ' MONTH like  '' % '' +@MONTH+ '' % ''  and  '
set  @strTDATE  =   ' TDATE = @TDATE and  '
set  @strPAGENUM  =   ' PAGENUM like  '' % '' +@PAGENUM+ '' % ''  and '

if  ( @CDATE  =   null  )  set  @strCDATE  =   ''
if  ( @FAC_NAME  =   null  )  set  @strFAC_NAME  =   ''
if  ( @BATTERY_TYPE  =   null  )  set  @strBATTERY_TYPE  =   ''
if  ( @MAKE_MODE  =   null  )  set  @strMAKE_MODE  =   ''
if  ( @PRODUCE_MODE  =   null  )  set  @strPRODUCE_MODE  =   ''
if  ( @YEAR  =   null  )  set  @strYEAR  =   ''
if  ( @MONTH  =   null  )  set  @strMONTH  =   ''
if  ( @TDATE  =   null  )  set  @strTDATE  =   ''
if  ( @PAGENUM  =   null  )  set  @strPAGENUM  =   ''

set  @strMAIN  =   ' select 
     CDATE         as  出厂时间,
     FAC_NAME     
as  发货厂家,
     BATTERY_TYPE    
as  电池型号,
     SEND_TYPE    
as  发货类型,
     SEND_NUM    
as  检测数量,
     MAKE_MODE    
as  制作方式,
     PRODUCE_MODE    
as  生产方式,
     BATTERY_NUM    
as  电池组数量,
     [YEAR]        
as  年,
     [MONTH]    
as  月,
     TDATE        
as  日期,
     SEND_RULE    
as  发货规则,
     SEND_CODE    
as  发货组编号,
     BATTERY_SORT    
as  电池类别,
     PAGENUM    
as  条码号,
     FITTING_CODE    
as  装配号,
     LINE_CODE    
as  生产机号,
     FLAG        
as  是否放行,
     REMARK        
as  备注,
     OTHER        
as  其他,
     BLANK_COL    
as  空白列
       from T_INFOCODE_NATURAL
    
where   '  + @strCDATE + @strFAC_NAME + @strBATTERY_TYPE + @strMAKE_MODE + @strPRODUCE_MODE
     +  @strYEAR  +  @strMONTH  +  @strTDATE  +  @strPAGENUM
exec(@strMAIN)

 

后又想到更加简短的语句:

 


create   proc  pr_select_Natural
(
 
@CDATE    datetime ,
 
@FAC_NAME   varchar ( 50 ),
 
@BATTERY_TYPE   varchar ( 20 ),
 
@MAKE_MODE   varchar ( 20 ),
 
@PRODUCE_MODE   varchar ( 20 ),
 
@YEAR    char ( 4 ),
 
@MONTH    char ( 2 ),
 
@TDATE    datetime ,
 
@PAGENUM   varchar ( 12 )
)
as
declare   @strWhere   varchar ( 500 )
if  (  @CDATE   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and CDATE = ' +   @CDATE
if  (  @FAC_NAME   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and FAC_NAME like  '' % '' +@FAC_NAME+ '' % ''   '
if  (  @BATTERY_TYPE   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and BATTERY_TYPE like  '' % '' +@BATTERY_TYPE+ '' % '''
if  (  @MAKE_MODE   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and MAKE_MODE like  '' % '' +@MAKE_MODE+ '' % '''
if  (  @PRODUCE_MODE   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and PRODUCE_MODE like  '' % '' +@PRODUCE_MODE+ '' % '''
if  (  @YEAR   =   null  ) 
 
set   @strWhere   = @strWhere +   '  and YEAR like  '' % '' +@YEAR+ '' % '''
if  (  @MONTH   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and MONTH like  '' % '' +@MONTH+ '' % '''
if  (  @TDATE   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and TDATE = @TDATE '
if  (  @PAGENUM   =   null  ) 
 
set   @strWhere   =   @strWhere + '  and PAGENUM like  '' % '' +@PAGENUM+ '' % '''
 
set   @strMAIN   =   ' select 
  CDATE  as 出厂时间,
  FAC_NAME  as 发货厂家,
  BATTERY_TYPE as 电池型号,
  SEND_TYPE as 发货类型,
  SEND_NUM as 检测数量,
  MAKE_MODE as 制作方式,
  PRODUCE_MODE as 生产方式,
  BATTERY_NUM as 电池组数量,
  [YEAR]  as 年,
  [MONTH] as 月,
  TDATE  as 日期,
  SEND_RULE as 发货规则,
  SEND_CODE as 发货组编号,
  BATTERY_SORT as 电池类别,
  PAGENUM as 条码号,
  FITTING_CODE as 装配号,
  LINE_CODE as 生产机号,
  FLAG  as 是否放行,
  REMARK  as 备注,
  OTHER  as 其他,
  BLANK_COL as 空白列
    from T_INFOCODE_NATURAL
 where 1=1 
'   + @strWhere
exec ( @strMAIN )

 

学习路漫漫,继续成长ing.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值