需求:
从订单表中查数据,并且按照Status字段1,3,4,2,排序
分析:
按照orderby Status方法,不管ASC还是DESC达不到目的。
可以用case when函数,但是case when的可维护性是比较差的,客户说按1,4,3,2排序,或者添加两个5,6,就要调整case when的顺序,容易出错。
SQL中有个函数charindex(exp1,exp2),功能就是判断exp1在exp2中的位置,如果不存在则返回0,类似js或者.net中的indexof函数
那么就可以迂回实现,Status字段就是exp1,客户需求的1342就是exp2,这样就是返回Status在1342中的位置,从而实现排序,而且,客户想修改排序规则,只需要修改exp2中的字符串即可,维护性比case when大大提升。
代码:
SELECT CHARINDEX(RTRIM(CAST(Status as NCHAR)),'1,3,4,2') as RowNumber,* FROM Orders ORDER BY CHARINDEX(RTRIM(CAST(Status as NCHAR)),'1,3,4,2')
注意:
严谨的说,使用这种方法需要加一个where语句,判断status在(1,3,4,2)中