データベース内の値が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
など
データベース内の値が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
など
order by registration_no + 0 asc
問題を解決するために使用します。
回答:
として格納されている場合、正の整数で並べ替える1つの方法varchar
は、最初に長さで並べ替え、次に値で並べ替えることです。
order by len(registration_no), registration_no
これは、列に数値以外の値が含まれている可能性がある場合に特に役立ちます。
注:一部のデータベースでは、のlength()
代わりに文字列の長さを取得する関数が呼び出される場合がありlen()
ます。
order by
、パフォーマンスにほとんど影響しません。
length()
代わりにlen()
SQL Serverを使用している場合:
ORDER_BY cast(registration_no as int) ASC
ORDER_BY cast(registration_no as unsigned) ASC
警告付きで目的の結果が得られます。
したがって、行く方が良い
ORDER_BY registration_no + 0 ASC
SQL警告のないクリーンな結果が得られます。
+ 0
いくのか説明できますか?私は自分のデータセットでそれをテストしました、そしてそれは確かに機能します、しかし私はなぜ興味がありますか?注文する前に数字に変換しますか?
列タイプがSTRING(CHAR、VARCHARなど)であり、並べ替え手順で文字列として並べ替えられていると仮定します。あなたがする必要があるのは、値を数値に変換することです。その方法は、使用するSQLシステムによって異なります。
場合によっては、数字とテキストを組み合わせて保存する必要があるという選択肢がないことがあります。アプリケーションの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
私はデータよりも「PAD」を行う方が好きです。MySqlはそれをLPADと呼んでいますが、SQLServerで同じことを行うように回避することができます。
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
この数式は、列の長さ3に基づいて先行ゼロを提供します。この機能は、ORDER BY以外の他の状況で非常に役立つため、このオプションを提供したかったのです。
結果:1は001になり、10は010になりますが、100は同じままです。