Mud*_*san 3 sql t-sql sql-server
我有一个表格,其中包含部分数据,如下所示.我已经在edition_id上完成了订单.现在还需要订购laungauge_id,这取决于edition_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)
我会创建一个补充排名表.然后我会加入以提供您的排序顺序.例如:
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,那么我将它限制在一个函数中,这样你就可以在其他地方重用逻辑.