按函数SQL定制订单

按函数SQL定制订单,sql,tsql,Sql,Tsql,我需要一个定制的ORDERBY子句,它看起来很像这样 但是,这个case语句已经增长,我希望能够将排序顺序重新用于其他查询 我认为我的选择是正确的 复制粘贴 将另一列专门为此排序顺序添加到表中 在我看来,我应该能够传递一个函数来执行排序逻辑。但是在SO和google上搜索了一段时间后,我找不到任何东西,我想这可能也会对其他人有所帮助。创建第二个包含两列(名称、排名)的表 第二个表将包含配对。一个选项是CTE: with ordering as ( select v.*

我需要一个定制的ORDERBY子句,它看起来很像这样

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

我认为我的选择是正确的

  • 复制粘贴
  • 将另一列专门为此排序顺序添加到表中

  • 在我看来,我应该能够传递一个函数来执行排序逻辑。但是在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]')