我有一个存储过程,由工会加入的3个查询组成。这有效。它目前按价值设置顺序如下:
ORDER BY [CategoryTypeID], [SortOrder], [Name]
我想让这个动态,所以我尝试使用这样的case语句:
ORDER BY CASE WHEN @sort = 0 then [CategoryTypeID] ELSE [SortOrder] end
然而,当我这样做时,sql抱怨如果语句包含union ......等,则按项目排序必须出现在选择列表中
但是,如果我改变上述内容以避免使用参数:
ORDER BY CASE WHEN 0 = 0 then [CategoryTypeID] ELSE [SortOrder] end
有效。当该参数实际上没有按顺序使用时,为什么我使用参数时会感到不快?我甚至尝试在select语句中包含参数,但它仍然给了我同样的错误。
我也试过在1等时做@sort案例但得到了相同的结果。我确实在我的存储过程中声明了参数 - @sort int = 0
这是MSSQL 2012 express
编辑 - 为了更加清晰
ORDER BY CASE WHEN @sort = 0 then [SortOrder] ELSE [CategoryTypeID] end
和
ORDER BY CASE WHEN @sort = 0 then [CategoryTypeID] ELSE [CategoryTypeID] end
这两个语句都失败,并且“必须出现在选择列表中”错误。我并没有试图同时使用这两种说法。只是给他们作为例子,列本身似乎不是一个问题。它使用看似问题的参数,即使参数本身未被选择或被排序。
答案 0 :(得分:4)
CASE WHEN 0 = 0 then [CategoryTypeID] ELSE [SortOrder] end
在编译时解析并简化为CategoryTypeID
你可以做到
WITH T
AS (SELECT [CategoryTypeID],
[SortOrder]
FROM T1
UNION
SELECT [CategoryTypeID],
[SortOrder]
FROM T2)
SELECT *
FROM T
ORDER BY CASE
WHEN @sort = 0 THEN [CategoryTypeID]
ELSE [SortOrder]
END
或者
SELECT [CategoryTypeID],
[SortOrder],
CASE
WHEN @sort = 0 THEN [CategoryTypeID]
ELSE [SortOrder]
END AS S
FROM T1
UNION
SELECT [CategoryTypeID],
[SortOrder],
CASE
WHEN @sort = 0 THEN [CategoryTypeID]
ELSE [SortOrder]
END AS S
FROM T2
ORDER BY S
答案 1 :(得分:2)
AFAICT SQL Server不支持这样的语句,如错误所示。您可以使用IF构造根据参数进行不同的排序。
IF @sort=0
SELECT ... ORDER BY CategoryTypeID;
ELSE
SELECT ... ORDER BY SortOrder;