alpha 列的条件 SQL ORDER BY ASC/DESC
在 MS SQL Server 2008 R2 中编写存储过程,我想避免使用 DSQL...
我希望排序方法(ASC 或 DESC)是有条件的。
现在,对于数字列,我只需使用 case 语句并否定该值以模拟 ASC 或 DESC... 也就是说:
... ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [NumericColumn] ELSE -[NumericColumn] END ASC
使用 alpha 列执行此操作的合适方法是什么?
编辑:我想到了一个聪明的方法,但它似乎效率非常低...我可以将我的有序 alpha 列插入到带有自动编号的临时表中,然后使用上述方法按自动编号进行排序。
EDIT2:
你们觉得这种方法怎么样?
ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [AlphaColumn] ELSE '' END ASC,
CASE @OrderAscOrDesc WHEN 0 THEN '' ELSE [AlphaColumn] END DESC
我不知道在统一列上强制排序是否比从排序字符串中派生数字更有效
Writing a stored procedure in MS SQL Server 2008 R2, I want to avoid using DSQL...
I would like the sort method (ASC or DESC) to be conditional.
Now, with a numeric column I would simply use a case statement and negate the value to emulate ASC or DESC...
That is:
... ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [NumericColumn] ELSE -[NumericColumn] END ASC
What is an appropriate method for doing this with an alpha column?
EDIT: I thought of a clever way but it seems terribly inefficient... I could insert my ordered alpha column into a temp table with an autonumber then sort by the autonumber using the method described above.
EDIT2:
What do you guys think of this approach?
ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [AlphaColumn] ELSE '' END ASC,
CASE @OrderAscOrDesc WHEN 0 THEN '' ELSE [AlphaColumn] END DESC
I don't know if forcing a sort on a uniform column is more efficient than deriving numbers from sorted strings though
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一个选项
或 CASE 恕我直言有点难看
One option
Or CASE which IMHO is a bit uglier
这是特定解决方案可能比通用解决方案更可取的情况之一,特别是当我们处理大量数据时。我会:
如果您在 [AlphaColumn] 上有索引,有时您可能会通过更具体的查询获得比通用的一刀切查询更好的计划。
编辑:为了促进代码重用,您可以将选择包装在内联 UDF 中 - 它的性能也一样:
This is one of those cases when specific solutions may be preferable preferable to generic ones, especially when we deal with large amounts of data. I would:
If you have an index on [AlphaColumn], you might sometimes get a better plan with a more specific query, than with a generic one-size-fits-all one.
Edit: to facilitate code reuse, you can wrap your select in an inline UDF - it will perform just as well: