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)	--合伙人姓名
	 
AS


DECLARE @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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值