试想如下情景:
有个数据查询页面,有很多条件供用户查询数据,但用户每次不一定所有条件都用到。返回的结果显示在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