我对从子句进行自定义订单的要求很像
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
但是,此案例语句已经增长,我希望能够重用其他查询的排序顺序。
我看到我的选择是
- 复制粘贴!
- 专门为此类顺序添加另一列
在我的脑海中,似乎我应该能够传递一个函数来执行排序逻辑。但是经过一些搜索和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
在之前过滤记录 select
, where
, group by
和 having
条款(从逻辑上)处理。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;
您的第二个表将包含配对。