【问题标题】:Creating custom order by SQL Server通过 SQL Server 创建自定义订单
【发布时间】:2015-01-21 16:02:39
【问题描述】:

客户希望按特定顺序显示我的查询返回的值列表。问题是简单地通过 asc 或 desc 订购并没有给我客户想要的东西。 DBA 不希望我对值进行硬编码。有没有办法在没有硬编码值的情况下自定义排序?因为这些值每年都会发生变化,并且每年都必须维护/更新。

Table Structure:
Column:  CMN_CodesID (unique), Name (is what I'd like to display in custom order)

【问题讨论】:

  • 自定义订单是什么意思?您是说要动态设置顺序吗?
  • 是的。我想按特定顺序显示结果。示例:杰克、苹果、橙子、芒果、香蕉。我想确保我的结果始终按顺序首先显示 Jack、Apple 和 Orange。

标签: sql-server sorting sql-order-by


【解决方案1】:

类似的东西。

order by case when Jack then 1 
          when Apple then 2 
          when Orange then 3 
          ...
         End

【讨论】:

  • 除了按顺序硬编码值没有别的办法吗?
  • @NonProgrammer - 据我所知这是 sql server 中的唯一方法
【解决方案2】:

您可以在存储过程中使用动态 sql 并将 @MyOrderBy 作为参数传递给它(添加到此示例中以进行说明)。

DECLARE @MyOrderBy VARCHAR(300)
SELECT @MyOrderBy = 'case when myfield = ''Jack'' then 1  when myfield = ''Apple'' then 2  when myfield = ''Orange'' then 3 else 4 End'


DECLARE @sSQL VARCHAR(300)

SELECT @sSQL = 'SELECT * FROM mytable ORDER BY ' + @MyOrderBy


EXEC(@sSQL)

【讨论】:

  • @Sean-Lange 我认为在没有充分考虑情况的情况下大喊 SQL 注入很容易。是的,如果 '@MyOrderBy' 中的值是用户输入,这将对 SQL 注入开放。在这种情况下,它并不是那么容易受到攻击。
  • 您的建议是使用接收字符串作为输入的存储过程。这意味着该程序容易受到注入。仅仅因为今天的使用不是用户输入并不意味着它不能在某个时候出现。交叉引用表将是更好的方法。这可能是一个持久表,甚至是一个具有值排序顺序的表值参数。当有其他解决方案不存在时,为什么还要保留一些易受攻击的东西?
  • 另外,这里的原因是因为 DBA(理所当然地)不想要一个硬编码的排序顺序列表。我怀疑这样的 DBA 永远不会允许按参数排序并在动态 sql 中执行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多