2017-08-01 9 views
1

OracleのテーブルからGridViewにデータを引き出すASP.NETアプリケーションがあります。私はオラクルのデータを全くコントロールしていません。それは何ですか(行番号は、パッケージの中に一緒に入っているキットの部分を示しています。私は2倍の小数点を使用するというアイデアは考えていません)。複数の小数点/ピリオドを含む奇数データ構造に「数値」ソートを適用する

データは次のようになります、と倍増小数点が(これはデータの行数千人の小さな一例です)問題は、次のとおりです。

LINE_NUMBER 
1.1 
2.1 
2.1..1 
2.1..2 
3.1 
4.1 
5.1 
6.1 
7.1 
8.1 
8.1..1 
8.1..2 
9.1 
10.1 
11.1 
:私はそれがこのように命じ必要

LINE_NUMBER 
1.1 
10.1 
11.1 
2.1 
2.1..1 
2.1..2 
3.1 
4.1 
5.1 
6.1 
7.1 
8.1 
8.1..1 
8.1..2 
9.1 

私は(「0」、LINE_NUMBER、9)LPADでエントリを水増ししようとしましたが、私はまだ原因倍増期間にグラグラ並べ替えを取得します。 See this SO question

私は(、「..」、 『』 LINE_NUMBER)、完全にダブルピリオドを削除するREGEXP_REPLACEを試みたが、それはどちらか動作しませんでした。私はこれがおそらくOracleの答えがどこにあるのだろうと思っていますが、私は完全なOracleのnoobですが、私はかなりMySQL/MariaDBに精通していますが& MS SQLです。

私もREGEXP_SUBSTR as shown in this siteしようとしましたが、私は彼の例は、私のために動作させることができませんでした。

また、this SO questionに示されている方法を試しましたが、複数の小数点を扱っていますが、隣り合った倍数は扱っていません。私は単純にダブルピリオド削除することができた場合

私は思います(最初の1の後または多分末尾のピリオドのちょうどすべてを?)、私は右の並べ替えを取得することができます。同じデータ列の別のコピーを単に選択して、GridViewのLINE_NUMBERではなく、その期間を削除してORDER BY列を削除することができます。二重小数点は本当に問題ではありません。もしそれらが削除されれば、文字列は数値でソートできる浮動小数点数になります(私は思う)。

これを行うための比較的簡単なOracleベースの方法がない限り、おそらく二重の期間に文字列を分割し、そこでソートを適用する方法を理解するために、コード内のデータテーブルを操作するつもりです。

私が先に言ったように、私は、Oracleのデータを制御できません、と私は、クエリ、データベースに書き込むことはできません。

質問に答えて、可能な文字列の一覧を示します。可能なことの例に過ぎないことに注意してください。これは、任意の数が3桁に行くことができること、また(しかし非常に低い)ことが可能です:

9.1 
41.1 
1.1..1 
1.1..15 
10.1..1 
15.1..3 
2.1..1 
2.1..10 
2.1..2 
21.1..1 
23.1..10 
23.1..2 
3.1..1 
30.1..1 
31.1..1 
4.1..1 
9.1..10 
9.1..2 

可能な例が、そう:

123.345..678 

最初の数はの「船のセット」であります2番目の番号は出荷セットのキット、2番目の小数点(存在する場合)の後の3番目の番号はBOMの明細です。私のユーザーによると、それらのいずれかのが2桁の上に行く可能性が不可能な、小さなではなくです。

+0

は、最初のドットと、最終的に二点間の第二の部分は(10含むことができますか、それは常に1 – LauDec

+0

と他の質問で、ありますそれは唯一の形式ですか?1.2..3.4も見つけられますか? – LauDec

+0

あなたの質問に答える質問の一番下にある追加情報を参照してください。2番目の質問にある形式は存在しません – delliottg

答えて

4

試してみてください。

SELECT LINE_NUMBER, 
     LINE_NUM 
FROM (
    SELECT LINE_NUMBER, 
     replace(Line_number, '..', '.') As Line_num 
    FROM table1 
) 
ORDER BY 
     to_number(regexp_substr(Line_num, '\d+', 1, 1)) NULLS FIRST, 
     to_number(regexp_substr(Line_num, '\d+', 1, 2)) NULLS FIRST, 
     to_number(regexp_substr(Line_num, '\d+', 1, 3)) NULLS FIRST, 
     to_number(regexp_substr(Line_num, '\d+', 1, 4)) NULLS FIRST 
; 

デモ:?http://sqlfiddle.com/#!4/1786b/11

| LINE_NUMBER | LINE_NUM | 
|-------------|----------| 
|   1 |  1 | 
|   1.1 |  1.1 | 
|   2.1 |  2.1 | 
|  2.1..1 | 2.1.1 | 
|  2.1..2 | 2.1.2 | 
|   3.1 |  3.1 | 
|   4.1 |  4.1 | 
|   5.1 |  5.1 | 
|   6.1 |  6.1 | 
|   7.1 |  7.1 | 
|   8.1 |  8.1 | 
|  8.1..1 | 8.1.1 | 
|  8.1..2 | 8.1.2 | 
|   9.1 |  9.1 | 
|  10.1 |  10.1 | 
|  11.1 |  11.1 | 
+0

10.1は彼の希望する解決策で9.1の後にする必要があります;) – LauDec

+0

@LauDecあなたは正しいです、私は私の答えを修正しました。 – krokodilko

+0

良い:)もし彼がこのレベルを1つしか持っていないなら、彼はもっと多くのことができるかどうか分からないか、彼が与えた例が書式の点で網羅的であれば – LauDec

関連する問題