4

これらの値を自然にソートするために、ORDER BY ステートメントに何を追加する必要があるかについて、誰かが私に手を貸してくれますか?

1
10
2
22
20405-109
20405-101
20404-100
X
Z
D

理想的には、次のようなものが欲しいです:

1
2
10
22
20404-100
20405-101
20405-109
D
X
Z

私は現在使用しています:

ORDER BY t.property, l.unit_number

値がどこにあるかl.unit_number

私はやってみましl.unit_number * 1l.unit_number + 0が、うまくいきませんでした。

ORDERなどの条件付きを行う必要がありCase When IsNumeric(l.unit_number)ますか?

ありがとうございました。

4

1 に答える 1

7

これはそれを行います:

SELECT value
FROM Table1
ORDER BY value REGEXP '^[A-Za-z]+$'
        ,CAST(value as SIGNED INTEGER)
        ,CAST(REPLACE(value,'-','')AS SIGNED INTEGER)
        ,value

の 4 つのレベルthe ORDER BY:

  1. REGEXP任意のアルファ ラインに 1 を割り当て、非アルファ ラインに 0 を割り当てます。
  2. SIGNED INTダッシュの前の部分ですべての数値を並べ替えます。
  3. SIGNED INTダッシュを削除した後、ダッシュの前の同じ値を持つ項目をダッシュ​​の後の部分で並べ替えます。番号 2 を置き換える可能性はありますが、場合によっては 90-1 を 9-01 と同じように扱いたくないでしょう。
  4. 文字をアルファベット順に並べ替えます。

デモ: SQL フィドル

于 2013-06-27T22:39:57.790 に答える