MySQL按一个列排序,该列具有由斜杠

时间:2015-05-21 12:54:17

标签: php mysql

我有一个表格(policy_details),其中包含“ notenumber ”列,其值为:

150/1  
150/2  
150/1/2  
150/2/1  

我需要使用 notenumber asc

的查询顺序显示如下所示的结果集
150/1  
150/1/2  
150/2  
150/2/1  

我试过了:

select *,REPLACE(notenumber, N'/', N'') AS newnotenumber 
from policy_details 
order by newnotenumber asc;

我需要按升序获取 notenumber

1 个答案:

答案 0 :(得分:1)

最好的解决方案是重新设计您的架构,以便将notenumber的每个部分存储在不同的字段中。除此之外,您需要拆分notenumber的每个部分,将其转换为数字类型,然后按顺序排序。对于您拆分的每个部分,您必须为order by添加一个条款,但没有办法解决这个问题。

示例:

select
  notenumber,
  replace(substring(substring_index(notenumber, '/', 1), length(substring_index(notenumber, '/', 1 - 1)) + 1), '/', ''),
  replace(substring(substring_index(notenumber, '/', 2), length(substring_index(notenumber, '/', 2 - 1)) + 1), '/', ''),
  replace(substring(substring_index(notenumber, '/', 3), length(substring_index(notenumber, '/', 3 - 1)) + 1), '/', '')
from test
order by
  convert(replace(substring(substring_index(notenumber, '/', 1), length(substring_index(notenumber, '/', 1 - 1)) + 1), '/', ''), signed integer),
  convert(replace(substring(substring_index(notenumber, '/', 2), length(substring_index(notenumber, '/', 2 - 1)) + 1), '/', ''), signed integer),
  convert(replace(substring(substring_index(notenumber, '/', 3), length(substring_index(notenumber, '/', 3 - 1)) + 1), '/', ''), signed integer)
;

请注意,您需要将拆分部分的索引号两次插入每个replace子句中。

上述解决方案的SQL小提琴:http://sqlfiddle.com/#!9/dc935/1/0