データベースで、値が 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
など
として格納されている場合、正の整数で並べ替える 1 つの方法はvarchar
、最初に長さ、次に値で並べ替えることです。
order by len(registration_no), registration_no
これは、列に数値以外の値が含まれる可能性がある場合に特に役立ちます。
注: 一部のデータベースでは、文字列の長さを取得する関数が のlength()
代わりに呼び出される場合がありlen()
ます。
ORDER_BY cast(registration_no as unsigned) ASC
値を数値に明示的に変換します。同じことを達成する別の可能性は
ORDER_BY registration_no + 0 ASC
これにより、暗黙の会話が強制されます。
実際には、テーブル定義を確認して変更する必要があります。int
このようにデータ型を変更できます
ALTER TABLE your_table MODIFY COLUMN registration_no int;
SQL Server を使用している場合:
ORDER_BY cast(registration_no as int) ASC
あなたの列のタイプはSTRING(CHAR、VARCHARなど)で、ソート手順はそれを文字列としてソートしていると思います。あなたがする必要があるのは、値を数値に変換することです。その方法は、使用する SQL システムによって異なります。
私はデータに対して「PAD」を行うことを好みます。MySql ではこれを LPAD と呼んでいますが、SQL Server で同じことを行う方法を回避できます。
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
この数式は、列の長さ 3 に基づいて先行ゼロを提供します。この機能は、ORDER BY 以外の状況で非常に役立つため、このオプションを提供したいと考えました。
結果: 1 は 001 になり、10 は 010 になりますが、100 は変わりません。