我有一个自定义ORDER BY子句的要求,看起来很像这个
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语句已经增长,我希望能够为其他查询重用排序顺序。
我看到我的选择
在我看来,似乎我应该能够传递一个函数来执行排序逻辑。但经过一些搜索SO和谷歌我无法找到任何东西,并认为这也可能有助于其他人在路上。
答案 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
在处理select
,where
,group by
和having
子句之前(逻辑上)过滤记录。 order by
仅在结果集中使用结果(逻辑上)。
当然,您可以将CTE值存储在临时表或表变量中。那可能就是你想要的。
另一种方法是有点黑客攻击,但在某些情况下可以使用。您可以用以下代码替换逻辑:
order by charindex('[' + name + ']', '[name1][name2][name]')
这假设所有名称都在列表中。并且这些名称没有分隔字符。这并不能直接解决您的问题,但您可以将字符串存储为代码块中的变量,甚至可以存储为表中的计算列。