TCUSTOM顺序按函数SQL



我对从子句进行自定义订单的要求很像

SQL自定义订单条款

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

但是,此案例语句已经增长,我希望能够重用其他查询的排序顺序。

我看到我的选择是

  1. 复制粘贴!
  2. 专门为此类顺序添加另一列

在我的脑海中,似乎我应该能够传递一个函数来执行排序逻辑。但是经过一些搜索和Google的搜索,我找不到任何东西,认为这也可能会帮助其他人。

一个选项是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]')

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

创建一个带有两个列(名称,等级)

的第二个表
SELECT * 
FROM example e INNER JOIN table2 t2 on e.name = t2.name
ORDER BY t2.rank ASC;

您的第二个表将包含配对。

最新更新