按顺序依次为依赖顺序

Mud*_*san 3 sql t-sql sql-server

我有一个表格,其中包含部分数据,如下所示.我已经在edition_id上完成了订单.现在还需要订购laungauge_id,这取决于edition_id的值.

  • Edition_id指的是报纸发布的城市.
  • Language_id指的是报纸发布的不同语言.

所以假设edition_id = 5它意味着新德里.
新德里language_id有13(英语),5(印地语),1(泰卢固语),4(乌尔都语).

我想要的是显示新德里,首先显示所有英文文章,然后是印地文,其次是泰卢固语,接着是乌尔都语.

如果edition_id = 1,则language_id的顺序应为13,1,2.

同样地,

如果edition_id = 5,则language_id的顺序应为13,5,1,4

现在我拥有的是什么

Edition_id | Language_id
1             1
1             2
1             13
1             1
1             13 
1             2
5             4
5             1
5             1
5             4
5             13
5             5
5             13 
Run Code Online (Sandbox Code Playgroud)

需要什么

Edition_id | Language_id
1             13
1             13
1             1
1             1
1             2 
1             2
5             13
5             13
5             5
5             1
5             1
5             4
5             4
Run Code Online (Sandbox Code Playgroud)

这该怎么做 ?请帮忙.

这样的事情是可能的

Select * from <table>
order by edition_id ,
            case when edition=6 then <order specified for language_id ie 13,5,1,4>
Run Code Online (Sandbox Code Playgroud)

Ste*_*yne 5

我会创建一个补充排名表.然后我会加入以提供您的排序顺序.例如:

EDITION_SORT_ORDER

EDITION_ID  LANGUAGE_ID  RANK
----------  -----------  ----
1           13           1
1           1            2
1           2            3
5           13           1
5           5            2
5           1            3
5           4            4
Run Code Online (Sandbox Code Playgroud)

在查询中使用此表可能如下所示:

SELECT E.EDITION_ID, E.LANGUAGE_ID
FROM <TABLE> E LEFT OUTER JOIN EDITION_SORT_ORDER S ON
  E.EDITION_ID = S.EDITION_ID AND
  E.LANGUAGE_ID = S.LANGUAGE_ID
ORDER BY S.RANK
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以在将来添加其他规则,这不是CASE逻辑的一大堆.

或者,如果要避免JOIN,可以创建一个存储函数,该函数执行类似的查找并返回排名(基于传递的EDITION_ID和LANGUAGE_ID参数).

如果你必须使用CASE,那么我将它限制在一个函数中,这样你就可以在其他地方重用逻辑.