自定义ORDER BY函数SQL

时间:2017-03-09 22:38:27

标签: sql tsql

我有一个自定义ORDER BY子句的要求,看起来很像这个

SQL Custom Order By Clause

SELECT * FROM example
ORDER BY 
CASE 
    WHEN name = 'I want this first' THEN 0
    WHEN name = 'I want this second' THEN 1
    WHEN name = 'We get the picture' THEN 2
    ELSE 99   END ASC

但是,这个case语句已经增长,我希望能够为其他查询重用排序顺序。

我看到我的选择

  1. 复制粘贴!
  2. 专门为此排序顺序向表中添加另一列
  3. 在我看来,似乎我应该能够传递一个函数来执行排序逻辑。但经过一些搜索SO和谷歌我无法找到任何东西,并认为这也可能有助于其他人在路上。

2 个答案:

答案 0 :(得分:4)

创建第二个包含两列(名称,等级)的表

SELECT * 
FROM example e INNER JOIN table2 t2 on e.name = t2.name
ORDER BY t2.rank ASC;

你的第二张表将包含配对。

答案 1 :(得分:2)

一种选择是CTE:

with ordering as (
      select v.*
      from (values(1, 'val1'), (2, 'val2'), (3, 'val3')) v(priority, val)
    )
select e.*
from example e
order by (select priority from ordering o where o.val = e.name);

我不鼓励你做一个明确的join,因为这可能会影响查询的语义。 join在处理selectwheregroup byhaving子句之前(逻辑上)过滤记录order by仅在结果集中使用结果(逻辑上)。

当然,您可以将CTE值存储在临时表或表变量中。那可能就是你想要的。

另一种方法是有点黑客攻击,但在某些情况下可以使用。您可以用以下代码替换逻辑:

order by charindex('[' + name + ']', '[name1][name2][name]')

这假设所有名称都在列表中。并且这些名称没有分隔字符。这并不能直接解决您的问题,但您可以将字符串存储为代码块中的变量,甚至可以存储为表中的计算列。