3

テーブル (抗原と呼ばれる) に文字列 (対立遺伝子と呼ばれる) があり、正しい順序に並べ替えるのに問題があります。

おそらく対立遺伝子の代表的なサンプルセット:-

  • 01:01
  • 01:02
  • 02:01
  • 04:01
  • 09:01N
  • 10:01
  • 104:01
  • 105:01
  • 11:01N
  • 03:01:01
  • 03:01:02

これらの対立遺伝子を次の順序にする必要があります:-

  • 01:01
  • 01:02
  • 02:01
  • 03:01:01
  • 03:01:02
  • 04:01
  • 09:01N
  • 10:01
  • 11:01N
  • 104:01
  • 105:01

104:01 & 105:01 は 11:01 の前に表示されるため、対立遺伝子を文字列として並べ替えることができません。

「:」文字を取り除いて数値でソートすることはできません。数値はそれぞれ 30101 と 30102 になるため、最後に 03:01:01 と 03:01:02 が配置されます。

これをどのように達成できるかについて私は困惑しており、どんな提案にも感謝しています。

乾杯

4

3 に答える 3

1

最大文字数を仮定するとbetween/before/after : is 3、以下のようにすべての文字列値を同じ長さと順序にすることができます。少し複雑に見えますが!

フィドルのデモ

;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 |
于 2013-03-19T13:04:08.653 に答える
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
于 2013-03-19T12:38:40.710 に答える
0

使用する

ORDER BY CAST (
             SUBSTR(Allelens
                    , 0
                    , CHARINDEX(Allelens, ':') - 1)
             AS INTEGER)
于 2013-03-19T12:39:48.090 に答える