2013-05-13 12 views
43

私は値を1〜999SQL - 1,2,3,4などの代わりに、1,10,11,12

ている私のデータベース内の数値欄で注文しようとしています私は使用します

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

+10

あなたのコラムでは、この動作に直面しているので、そのvarchar型のタイプのものです。 – Meherzad

+0

registration_noカラムのデータ型は何ですか? –

+4

'order by registration_no + 0 asc'を使って問題を解決してください。 – Meherzad

答えて

35
ORDER_BY cast(registration_no as unsigned) ASC 

は数値を明示的に数値に変換します。これを達成する別の可能性は、暗黙の会話を強制する、

ORDER_BY registration_no + 0 ASC 

です。

実際には、テーブル定義を確認して変更する必要があります。あなたはそれを文字列としてソートされて、私はあなたの列の型がSTRING(CHAR、VARCHARなど)であると仮定しint

このような
ALTER TABLE your_table MODIFY COLUMN registration_no int; 
2

にデータ型を変更し、手順をソートすることができます。あなたがする必要があるのは、値を数値に変換することです。それを行う方法は、使用するSQLシステムに依存します。それらはvarcharとして格納される正の整数で注文する

66

一つの方法は、第1およびその後の値の長さで注文することにある。

order by len(registration_no), registration_no 

列が非数値含む可能性がある場合に特に有用です値。

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

+1

うわー。私の畏怖を表明する言葉がない – Lordbalmon

+0

これはすべての場合に機能しません。頭の上から外れている場合、うまくいかないケースは整数のミックスです。負の数、先行ゼロのある数字、分数のある数字、単語と数字の組み合わせ。 –

+7

@ Knickerless-Noggins。 。 。答えの最初の文を読んでください。私はそれがかなり明らかだと思います。 –

8

は、SQL Serverを使用している場合:私は、データを "パッド" やっ好む

ORDER_BY cast(registration_no as int) ASC 
+0

非常に良い、thx :) – Zombyii

1

。 MySqlはそれをLPADと呼んでいますが、SQL Serverで同じことをすることができます。

ORDER(STR(COLNAME、3)、スペース(1)、「0」)REPLACE

することによって、この式は、この機能は、他の状況で非常に有用である3の列の長さに基づいて先行ゼロを提供しますORDER BYの外にあるので、私はこのオプションを提供したかったのです。

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

0

場合によっては、数値をテキストと混在させて保存する必要がない場合もあります。私たちのアプリケーションの1つでは、私たちの電子商取引サイトに使用するWebサイトホストは、フィルターを動的にリストから除外します。表示されているテキスト以外のフィールドでソートするオプションはありません。 2 "〜8" 9 "〜12" 13 "〜15"などと言ったリストからフィルタを作成したかったとき、私たちはそれを2〜9-13でなく13-2-9でソートする必要がありました。それは数値を読むときになります。そこで、SQL Server Replicate関数を最長の長さと共に使用して、より短い数字に先頭のスペースを埋め込みました。今は20が3の後にソートされます。

アイテムの種類とクラスの最小と最大の長さと幅などを表示するビューを使用していましたが、ここではそのテキストの作成方法の例を示します。 (高LB N低及びLB Nが低く、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