我在表格(称为Antigens)中有字符串(称为Alleles),我无法按正确顺序排序。
Alleles的代表性样本集可能是: -
我需要这些等位基因按以下顺序排列: -
我无法将Alleles排序为字符串因为104:01& 105:01将出现在11:01之前。
我无法删除':'字符并按数字排序,因为它会将03:01:01&最后03:01:02因为数值是30101&分别为30102。
我很难过如何实现这一目标,并对任何建议表示感谢。
干杯
答案 0 :(得分:1)
假设最大字符数between/before/after : is 3
,您可以使所有字符串值的长度和顺序相同,如下所示。看起来有点复杂!
<强> Fiddle demo 强>
;with cte as (
select val, charindex(':',val,1) index1,
charindex(':',val,charindex(':',val,1)+1) index2
from t
)
select val,right('000' + left(val,index1-1),3) + ':' +
case when index2-index1>0
then right('000' + substring(val,index1+1,index2-index1-1),3)
else right('000' + substring(val,index1+1,len(val)),3) end + ':' +
case when index2>0
then right('000' + right(val, len(val) - index2),3)
else '000' end As odr
from cte
order by odr
| VAL | ODR |
--------------------------
| 01:01 | 001:001:000 |
| 01:02 | 001:002:000 |
| 02:01 | 002:001:000 |
| 03:01:01 | 003:001:001 |
| 03:01:02 | 003:001:002 |
| 04:01 | 004:001:000 |
| 09:01N | 009:01N:000 |
| 10:01 | 010:001:000 |
| 11:01N | 011:01N:000 |
| 104:01 | 104:001:000 |
| 105:01 | 105:001:000 |
答案 1 :(得分:0)
你想在冒号之前用数字排序吗?如果是的话,这样的事情应该这样做:
select *
from mytable
order by cast(substring(col, 0, CHARINDEX(':', col)) as int)
结果:
01:01
01:02
02:01
03:01:01
03:01:02
04:01
09:01N
10:01
11:01N
104:01
105:01
答案 2 :(得分:0)
使用
ORDER BY CAST (
SUBSTR(Allelens
, 0
, CHARINDEX(Allelens, ':') - 1)
AS INTEGER)