SQL——處理頁面多條件查詢,sql頁面查詢

來源:互聯網
上載者:User

SQL——處理頁面多條件查詢,sql頁面查詢



             以前處理多條件查詢,主要是兩種方法,第一種是在條件裡面判斷要填入條件的欄位,然後判斷傳入參數是否為空白,如果為空白,就用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..這個東西的用法,感覺挺好玩兒的。

















相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.