SQLでアパートメント番号のテーブルをソートする必要があります。よく知られていない人にとっては、これらは必ずしも数字ではありませんが、あたかもあたかもあたかもあたかも数字の順序付けが必要です。SQLでのアパート番号の並べ替え - 数値的辞書的順序付け
-たとえば、次のようにアパートの番号の可能なセットを注文することになりますないすべてのアパート - の数字が文字列でエンコードされた小数の整数であるため、
1
10
101
101-A
1000
200
200A
2000
C
D
E-100
F
がORDER BY CONVERT(int, ApartmentNumber)
を行うと、動作しないでしょう。同様にORDER BY ApartmentNumber
を実行すると、1000
の後に101
が配置されるため、機能しません。
StackOverflowの上の他のQAは、一般的に値Sorting string column containing numbers in SQL?やエラー処理と並べ替えを行うための既知の固定形式のいずれかで自分自身を懸念:私自身のプロジェクトでSorting field by numerical value and lexicographical value
、以前の開発者は、このトリックを使用:
ORDER BY
RIGHT('00000000000000000000' + RTRIM(ApartmentNumber), 20) ASC
...さらに悪いと感じる...。何故なら、このトリックはアルゴリズム的には健全です。データベースエンジンに文字列割り当てを実行させるためのハッキングのような感じです(連結を最適化しない場合は複数回もあり、文字列操作にはRTRIM
)。
別のアプローチは、上差し出さSOです:
ORDER BY
LEN(ApartmentNumber),
ApartmentNumber
...しかし、これは入力セットのこの間違った順序が得られます。
1
C
D
F
10
101
200
1000
2000
200A
101-A
E-100
私は2008年にSQL Serverのローカルで2012を(使用しています(レベル100
)互換モード)、このアプリケーションはAzure SQLサーバー(Azure SQL V12)にデプロイされます。
UPDATE:
私はいくつかの選択肢を検討してきた、私は「最高の」ではなくvarchar(10)
の固定長char(10)
フィールドを使用すると、フィールドの内容が常に左整列されていることを確実にするためだと思いますそうすれば並べ替え順序は簡単にORDER BY ApartmentNumber
で保証されます。
更新2:上記の考え(char(10)
)は、2000
の前にソートする必要がある200A
の問題を解決しません。私は最善の解決策は、均一な整数表現に値を正規化し、そのint値をデータベースに格納することだと思う。変換を行うアルゴリズムは、SQLで記述されていない場合(つまり、最も簡潔に)最適です。
どのdbmsを使用していますか? –
@vkp良いクロスプラットフォームソリューションがあることを期待していましたが、SQL Server 2012とSQL Azure V12をターゲットにしています。 – Dai
おそらく、さまざまなフォーマットすべてにマッチする一連のマスクが必要です。 – shawnt00