web-dev-qa-db-ja.com

番号順のSQL-1,10,11,12の代わりに1,2,3,4など

値が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など

64
Konnor262

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

order by len(registration_no), registration_no

これは、列に数値以外の値が含まれる場合に特に役立ちます。

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

110
Gordon Linoff
ORDER_BY cast(registration_no as unsigned) ASC

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

ORDER_BY registration_no + 0 ASC

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

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

ALTER TABLE your_table MODIFY COLUMN registration_no int;
54
juergen d

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

ORDER_BY cast(registration_no as int) ASC
11
IPOSTEDONCE

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

2
user170442

ORDER_BY cast(registration_no as unsigned) ASC

警告とともに目的の結果が得られます。

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

ORDER_BY registration_no + 0 ASC

sQL警告のないきれいな結果を得るために。

1
priyanka

データに対して「PAD」を行うことを好みます。 MySqlはLPADと呼びますが、SQL Serverで同じことを行うために回避することができます。

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

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

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

1

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

私は、アイテムのタイプとクラスの最小と最大の長さ、幅などを提供するビューで作業していましたが、ここにテキストの作成方法の例を示します。 (LB n LowおよびLB n Highは、5つの長さ括弧の下限と上限です。)

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
Joey Morgan