SQL——处理页面多条件查询

来源:互联网 发布:网络流行文化有哪些 编辑:程序博客网 时间:2024/06/05 17:17



             以前处理多条件查询,主要是两种方法,第一种是在条件里面判断要填入条件的字段,然后判断传入参数是否为空,如果为空,就用1=1替代这个条件;第二种方法,先判断传入参数是否为空,如果不为空,将条件拼接到一个字符里面,最后再使用exec执行字符串;最近又要做这个东西,感觉还是挺熟悉的,额,,其实是挺无聊的。但是在做的过程中跟旁边大哥闲扯的时候,他又给我写了一种case...when...end..的方式,贴出来给大家看看:


                  

ALTER PROCEDURE [dbo].[sp_LoadSellerDataByPartner]  --通用参数   @PartnerCode NVARCHAR(36),--合伙人编码  @pageSize INT=10, --一页内有多少条数据   @pageIndex INT=1, --第几页    ----多条件查询参数(商家编号,商家名称,入驻时间,合伙人姓名)@QureSellerNumber NVARCHAR(36), --商家@QuerSellerName NVARCHAR(100), --商家名称        @QuerBuildTime NVARCHAR(36),--入驻时间@QueryUserName NVARCHAR(100)--合伙人姓名 ASDECLARE @totalCount INT; --共有多少条数据 --查询出商家编号,商家名称,商家地址,入驻时间,合伙人姓名,本期订单数量,累计营业额WITH temp AS (SELECT s.[SellerNumber]/*商家编号*/,s.Code,/*商家code*/s.[SellerName]/*商家名称*/,s.[Address]/*商家地址*/,LEFT(convert(varchar,s.[BuildTime],21),10) AS BuildTime/*入驻时间*/,cpu.[UserName]/*合伙人姓名*/,(SELECT COUNT(1) FROM  CommunityCatering.Catering.[Order] o WHERE o.SellerCode=s.Code AND o.CompleteTime BETWEEN DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0) AND GETDATE() ) AS OrderCount/*查询从月初到现在的订单量*/,(SELECT SUM(TotalCharge) FROM [CommunityCatering].[Catering].[SellerIncome] SI WHERE SI.CreateTime BETWEEN DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0) AND GETDATE() AND s.Code=SI.SellerCode AND SI.ValidStatus=1) AS SumMonthMoney/*本期营业额(注意判断有效性)*/,(SELECT SUM(TotalCharge) FROM [CommunityCatering].[Catering].[SellerIncome] SA WHERE  SA.SellerCode=s.Code AND SA.ValidStatus=1) AS SumTotalMoney/*累计营业额(注意判断有效性)*/,ROW_NUMBER() OVER(ORDER BY s.[SellerNumber]) AS RowNum/*分页需要字段*/FROM [CommunityCatering].[Catering].[Seller] s LEFT JOIN [CommunityCatering].[Catering].[CateringPartnerUser] cpu ON cpu.Code=s.[PartnerUserCode] WHERE s.ValidStatus=1/*审核通过商家*/ AND cpu.Code=@PartnerCode--这里需要合伙人(例如:'ff48648d-4e61-b702-4f12-80ed41d791ae'))SELECT * FROM temp  WHERE/*下面将查询条件加入:商家编号,商家名称,入驻时间,合伙人姓名*/ --商家编号  (CASE  WHEN ISNULL(@QureSellerNumber,'0')='0' OR @QureSellerNumber=''  THEN  1 ELSE   CAST(CHARINDEX(@QureSellerNumber,temp.[SellerNumber]) AS BIT)   END)=1 AND --商家名称(CASE  WHEN ISNULL(@QuerSellerName,'0')='0' OR @QuerSellerName=''  THEN  1 ELSE   CAST(CHARINDEX(@QuerSellerName,temp.[SellerName]) AS BIT)   END)=1 AND --入驻时间(CASE  WHEN ISNULL(@QuerBuildTime,'0')='0' OR @QuerBuildTime=''  THEN  1 ELSE   CAST(CHARINDEX(@QuerBuildTime,temp.[BuildTime]) AS BIT)   END)=1 AND --合伙人姓名(CASE  WHEN ISNULL(@QueryUserName,'0')='0' OR @QueryUserName=''  THEN  1 ELSE   CAST(CHARINDEX(@QueryUserName,temp.[UserName]) AS BIT)   END)=1 AND temp.RowNum BETWEEN (((@pageSize)*(@pageIndex-1))+1) and (@pageIndex)*(@pageSize)   /*根据rownum进行分页*/--输出一共有多少行:程序中进行分页需要这个东西SELECT @totalCount=(SELECT COUNT(s.[SellerNumber])FROM [CommunityCatering].[Catering].[Seller] s LEFT JOIN [CommunityCatering].[Catering].[CateringPartnerUser] cpu ON cpu.Code=s.[PartnerUserCode] WHERE cpu.Code=@PartnerCode)--输出计算出的总行数SELECT @totalCount 


             个人感觉,这种方法也挺巧妙的,有兴趣的童鞋可以查出case..这个东西的用法,感觉挺好玩儿的。

















0 0
原创粉丝点击