您的位置:首页 > 其它

动态排序和动态查询条件

2016-03-27 15:08 225 查看
试想如下情景:

有个数据查询页面,有很多条件供用户查询数据,但用户每次不一定所有条件都用到。返回的结果显示在DataGrid中,用户可以点击列标题来决定用哪个列来排序。

这里遇到的问题就是每次查询时查询插件和排序的列是不确定的,但是最大集是确定的。

一般做法是动态构造SQL语句,然后使用EXECUTE执行。这里不做说明,如果不采用动态构造查询语句可以如下处理,以SQL做实际示范:

----查询条件---
DECLARE @ColumnName VARCHAR(500)=null
DECLARE @ColumnType VARCHAR(500)=NULL--'int'
DECLARE @TableName VARCHAR(500)='tablename'
---排序条件 -----------
DECLARE @OrderBy INT=2;--1.ColumnName,2.TableName,3.Column Data Type
SELECT o.[type], o.name AS TableName,TYPE_NAME(c.user_type_id) AS TypeName,  *
FROM sys.[columns] AS c INNER JOIN sys.objects AS o ON o.[object_id]=c.[object_id]
WHERE o.[type]='U'
AND o.name LIKE '%'+ISNULL(@TableName,o.name)+'%'
AND c.name LIKE '%'+ISNULL(@ColumnName,c.name)+'%'
AND TYPE_NAME(c.user_type_id)=ISNULL(@ColumnType,TYPE_NAME(c.user_type_id))
ORDER BY CASE  @OrderBy WHEN 1 THEN c.name  WHEN 2 THEN o.name  WHEN 3 THEN TYPE_NAME(c.user_type_id) ELSE '' END DESC


1=1就和没加这个条件一样

这里仍然有另外一个问题,假如不同的字段使用不同的排序规则怎么办,比如有的升序,有的降序。
这可以根据集体情况集体解决,比如是数值字段,只要取负,排序结果就变了。但如果不能这么处理,就需要将升级和降序的字段分开。

每次执行仅一个排序条件生效,另外一个变成常量

ORDER BY CASE  @OrderBy WHEN 1 THEN c.name ELSE '' END ASC,
CASE @OrderBy WHEN 2 THEN o.name  WHEN 3 THEN TYPE_NAME(c.user_type_id) ELSE '' END DESC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: