T-SQLの数字のように見えるものは、どのようにして注文できますか?

私はvarchar(3)であるCodeという名前の列を持っています。

それは数字と文字列も含んでいます。例: '1'、 '234'、 'Xxx'、 '9'、 'Aa' など

方法はありますか?数字のように見えるMS EXCEL- ORDERのような数字ですか?

上記の例の出力は次のようになります:

1. 1 
2. 234 
3. 9 
4. Aa 
5. Xxx
1
残念だけど違う。 Bcozは、 "109"と "11"があるとき、109の結果の前に11が来ます。
追加された 著者 pencilCake,
@gbn:以前のものでは、私はalingmentに助けになることを望んでいましたが、ここで私はORDERINGロジックisnteadを聞いています。
追加された 著者 pencilCake,
@gbn:関連する質問にスクリーンショットを添付しました。
追加された 著者 pencilCake,
@gbn:私はあなたの前提をどのように証明できますか?私はそれがスペースでないかどうかテストすることを意味しますか?
追加された 著者 pencilCake,
うーん。あなたの望む出力は私にとっては普通のソート順です。
追加された 著者 juergen d,
@pencilCake:他の答えで更新しました
追加された 著者 gbn,
@pencilCake:RTRIMが失敗すると、スペースがありません。あなたは、ハードスペースやタブなどがあります
追加された 著者 gbn,
@pencilCake:それで、前の答えがあなたにとってうまくいかないかここで説明してください...
追加された 著者 gbn,
最近の質問とはどのように違いますか? stackoverflow.com/q/9162346/27535 右揃えを行うと、文字列1の「11」の数値ソートが強制的に開始されます"109"
追加された 著者 gbn,
それが結果を注文する方法です。数字のように見えるものを注文する場合は、234は9の後にする必要があります
追加された 著者 Lamak,

2 答え

ORDER BY CASE WHEN ISNUMERIC(YourField) = 1 THEN CONVERT(INT, YourField) - 500 ELSE ASCII(LOWER(YourField)) END

フィールドを数値に変換できる場合は、数値でソートされます。そうでない場合は、ASCIIコーディングを使用してソートされます。私は " - 500"を使用しているので、ソートにクロスオーバーはなく、数字がテキストよりも先にソートされていることを確認しています。


追加情報:

Brian Arsuaga has posted a more robust solution to this which I actually prefer, but since this has already been marked as the answer I am adding his solution to this for the benefit of anyone reading this in the future.

ORDER BY 
        ISNUMERIC(YourField) DESC, 
        CASE WHEN ISNUMERIC(YourField) = 1 THEN CONVERT(INT, YourField) ELSE 0 END,
        YourField
4
追加された
@GarethD:ITはそうする。しかし、私は-500を-1000に変更しました。それは正しいです。
追加された 著者 pencilCake,
うわー!これは本当にうまくいった! :)
追加された 著者 pencilCake,
私は-500のポイントを得ていませんでした。あなたはそれを詳述できますか?
追加された 著者 pencilCake,
私はちょうどあなたが質問で尋ねたことをしないことに気づいた、私はあなたの質問を働いたと言って以来推測している間違いが含まれています。投稿した方法を使用してデータを出力すると、234の前に9が入ります。
追加された 著者 GarethD,
" - 500"は、変換されたint値を並べ替えのASCII値から取り除くことです。たとえば、ASCII以外の任意の数値(ASCII( "x")の結果)の前に "X"が表示されます。 500はあなたのサンプルのどの数字よりも大きいので、私が選んだ任意の数字でした。選択する数値はデータの最大サイズよりも大きくする必要があります。したがって、varchar(3)カラムでは、500の代わりに1000を使用する方がよいでしょう
追加された 著者 GarethD,
ISNUMERIC に関する予期せぬ結果を与えるのに通常の注意を追加しています....
追加された 著者 JNK,

任意のセンチネル(500)を使用するのが気に入らない場合は、予想される数値の範囲によってソートの問題が発生する可能性があるため、複数の式を並べ替えて使用することができます。

-- put the numbers at the top
ORDER BY ISNUMERIC(YourField) DESC,
       -- sort the numbers as numbers, sort the strings as nothing
       CONVERT(INT, CASE WHEN ISNUMERIC(YourField) = 1 THEN YourField ELSE '0' END),
       -- sort the strings
       YourField

最後のタームは、2つのタームが同じ値( '01'、 '1')の両方の数字であるか、2つのタームが両方とも非ナンバーである場合のタイブレイカーです。非数字の場合、第1項と第2項は常に0になります。

もっと複雑ですが、もう少し安全です。

下の男の助けを借りて素敵な比較を追加するために編集

create table #t
(
    YourField varchar(4)
)
insert into #t(YourField) Values('1'), ('3'), ('234'), ('0'), ('00'),
   ('09'), ('9'), ('1a'), ('aaa'), ('aba'), ('-500')

Select YourField from #t

  ORDER BY ISNUMERIC(YourField) DESC,
           CONVERT(INT, CASE WHEN ISNUMERIC(YourField) = 1 THEN YourField ELSE '0' END),
           YourField

drop table #t

example results

2
追加された
+1私は私の答えにこれを好む。私が答えとして私の印を外す方法を知っていて、これを答えにするなら、私はあなたのより良い方法を示すために私の答えに補遺をどのように加えたのか分からないからです。
追加された 著者 GarethD,