SQL——处理页面多条件查询
2015-02-14 00:30
190 查看
以前处理多条件查询,主要是两种方法,第一种是在条件里面判断要填入条件的字段,然后判断传入参数是否为空,如果为空,就用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..这个东西的用法,感觉挺好玩儿的。
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..这个东西的用法,感觉挺好玩儿的。
相关文章推荐
- SQL——处理页面多条件查询
- 动态SQL中的查询条件参数化处理
- 当查询一个列表的时候获取此列表id结果作为另一个sql的是否存在的条件处理
- SQL 查询语句 IIF()处理条件判断
- 如何从页面输入SQL查询条件得到后台结果返回前台页面
- 【selenium webdriver】 XPath 多条件查询语句(处理同一个页面上出现相同文本按钮的动态ID元素定位)
- SQL中多条件查询的处理,避免使用SQL拼接
- Microsoft SQL Server中条件字段是Nvarchar类型的,条件有中文的无法查询的原因及处理方法
- oracle 模糊查询 (处理jsp页面传过来的条件)
- SQL 复合查询条件(AND,OR,NOT)对NULL值的处理方法
- 动态SQL中的查询条件参数化处理
- 页面Sql语句 查询根据判断值是否存在拼接查询条件
- sql的where条件中包含中文,查询不出来的处理方法
- 关于linq语句与sql语句查询条件==null处理的奇妙现象
- SQL 查询语句 IIF()处理条件判断
- oracle 模糊查询 (处理jsp页面传过来的条件)
- SQL中,查询条件中的引号处理,单引号,双引号
- SQL 复合查询条件(AND,OR,NOT)对NULL值的处理方法
- ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)
- sql查询 group by 数字类型+null 为null 处理 ,sum()的结果作为条件再次查询。