番号で注文するためのSQL-1,10,11,12ではなく1,2,3,4など


87

データベース内の値が1〜999の数値列で並べ替えようとしています

使うとき

ORDER_BY registration_no ASC

…。

1
101
102
103
104
105
106
107
108
109
11
110
Etc…

したがって、数字とは対照的に、最初の桁で順序付けられているように見えます。

これを値で並べ替える場合に使用するSQLを知っている人はいますか?だから1,2,3,4,5,6など


11
列はvarchar型であるため、この動作に直面しています。
Meherzad 2013年

Registration_no列のデータ型は何ですか?
Praveen Prasannan 2013年

9
order by registration_no + 0 asc問題を解決するために使用します。
Meherzad 2013年

10
文字列に数字を格納しないでください。あなたの問題はそのエラーの直接の結果です。
a_horse_with_no_name 2013年

1
私の列はVarcharであり、保存するデータはクラス10 /クラス9 /クラス8です。クラス10はクラス8の前にあります。display_order列を使用せずにこれを解決するにはどうすればよいですか?
VishnooRath20年

回答:


142

として格納されている場合、正の整数で並べ替える1つの方法varcharは、最初に長さで並べ替え、次に値で並べ替えることです。

order by len(registration_no), registration_no

これは、列に数値以外の値が含まれている可能性がある場合に特に役立ちます。

注:一部のデータベースでは、のlength()代わりに文字列の長さを取得する関数が呼び出される場合がありlen()ます。


1
これはすべての場合に機能するとは限りません。頭のてっぺんから、うまくいかないケースは整数と;の混合です。負の数、先行ゼロのある数、分数と単語と数を組み合わせた数。
WonderWorker

10
@ Knickerless-Noggins。。。答えの最初の文を読んでください。かなりはっきりしていると思います。
ゴードンリノフ2017年

@GordonLinoffは同じ列で2回注文していますが、CPUとメモリを大量に消費しませんか?
loneStar 2017年

@Achyuth。。。内のキーの数はorder by、パフォーマンスにほとんど影響しません。
ゴードンリノフ2017年

1
Oracle SQLの場合は、length()代わりにlen()
Stevoisiak 2010年

62
ORDER_BY cast(registration_no as unsigned) ASC

値を明示的に数値に変換します。同じことを達成する別の可能性は

ORDER_BY registration_no + 0 ASC

これは暗黙の会話を強制します。

実際には、テーブル定義を確認して変更する必要があります。intこのようにデータ型を変更できます

ALTER TABLE your_table MODIFY COLUMN registration_no int;

13

SQL Serverを使用している場合:

ORDER_BY cast(registration_no as int) ASC

4
ORDER_BY cast(registration_no as unsigned) ASC

警告付きで目的の結果が得られます。

したがって、行く方が良い

ORDER_BY registration_no + 0 ASC

SQL警告のないクリーンな結果が得られます。


なぜうまく+ 0いくのか説明できますか?私は自分のデータセットでそれをテストしました、そしてそれは確かに機能します、しかし私はなぜ興味がありますか?注文する前に数字に変換しますか?
JoshuaPinter20年

2

列タイプがSTRING(CHAR、VARCHARなど)であり、並べ替え手順で文字列として並べ替えられていると仮定します。あなたがする必要があるのは、値を数値に変換することです。その方法は、使用するSQLシステムによって異なります。


1

場合によっては、数字とテキストを組み合わせて保存する必要があるという選択肢がないことがあります。アプリケーションの1つでは、eコマースサイトに使用するWebサイトホストが、リストから動的にフィルターを作成します。表示されたテキスト以外のフィールドで並べ替えるオプションはありません。2 "から8" 9 "から12" 13 "から15"などのリストからフィルターを作成したい場合は、13-2-9ではなく2-9-13を並べ替える必要がありました。数値の読み取り。そこで、SQL Serverのレプリケート関数と最長の数値の長さを使用して、短い数値に先頭のスペースを埋め込みました。これで、20は3の後にソートされます。

アイテムの種類とクラスの最小と最大の長さ、幅などを表示するビューで作業していました。これは、テキストの作成方法の例です。(LB NローとLB Nハイ5つの長ブラケットのLowとHigh端です。)

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text

1

私はデータよりも「PAD」を行う方が好きです。MySqlはそれをLPADと呼んでいますが、SQLServerで同じことを行うように回避することができます。

ORDER BY  REPLACE(STR(ColName, 3), SPACE(1), '0') 

この数式は、列の長さ3に基づいて先行ゼロを提供します。この機能は、ORDER BY以外の他の状況で非常に役立つため、このオプションを提供したかったのです。

結果:1は001になり、10は010になりますが、100は同じままです。


0

この問題は、CHAR、VARCHAR、またはTEXTデータ型で列を宣言したために発生します。データ型をINT、BIGINTなどに変更するだけです。これにより、カスタム注文の問題が解決されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.