按函数SQL定制订单
我需要一个定制的ORDERBY子句,它看起来很像这样 但是,这个case语句已经增长,我希望能够将排序顺序重新用于其他查询 我认为我的选择是正确的按函数SQL定制订单,sql,tsql,Sql,Tsql,我需要一个定制的ORDERBY子句,它看起来很像这样 但是,这个case语句已经增长,我希望能够将排序顺序重新用于其他查询 我认为我的选择是正确的 复制粘贴 将另一列专门为此排序顺序添加到表中 在我看来,我应该能够传递一个函数来执行排序逻辑。但是在SO和google上搜索了一段时间后,我找不到任何东西,我想这可能也会对其他人有所帮助。创建第二个包含两列(名称、排名)的表 第二个表将包含配对。一个选项是CTE: with ordering as ( select v.*
在我看来,我应该能够传递一个函数来执行排序逻辑。但是在SO和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
在处理select
、where
、groupby
和having
子句之前过滤记录(逻辑上)。排序依据仅使用结果集中的结果(逻辑上)
当然,您可以将CTE值存储在临时表或表变量中。那可能就是你想要的
另一种方法有点像黑客,但在某些情况下是有效的。您可以将逻辑替换为:
order by charindex('[' + name + ']', '[name1][name2][name]')
这假定所有名称都在列表中。而且名称没有分隔符字符。这并不能直接解决您的问题,但您可以将字符串作为变量存储在代码块中,甚至可以作为计算列存储在表中。使用内联用户定义函数我不建议使用这种方法,因为
连接可以影响查询的语义。嗯,我一直认为数据库足够智能,可以进行优化。感谢您的评论,否则我将永远不会阅读您的答案并了解到这一点。以下查询可能不会产生相同的结果:从示例中选择e*,count(*)over()。
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);
order by charindex('[' + name + ']', '[name1][name2][name]')