VARCHAR
としてMySQLデータベースに番号を保存しています。他の状況に応じて、それらをINT
にすることはできません。
ソート中に、数値としてではなく文字としてそれらを使用しています。
データベースにあります
1 2 3 4 5 6 7 8 9 10...
私のページでは、次のような順序付きリストが表示されます。
1 10 2 3 4 5 6 7 8 9
数字の昇順で並べて表示するにはどうすればよいですか?
とにかく数値のみを保存する場合は、可能であれば、列のデータ型を数値に変更する必要があります。
それができない場合、列値をinteger
にキャストしますexplicitly
select col from yourtable
order by cast(col as unsigned)
または暗黙的にたとえば、数値への変換を強制する数学演算を使用する
select col from yourtable
order by col + 0
BTW MySQLは文字列を左から右に変換します。例:
string value | integer value after conversion
--------------+--------------------------------
'1' | 1
'ABC' | 0 /* the string does not contain a number, so the result is 0 */
'123miles' | 123
'$123' | 0 /* the left side of the string does not start with a number */
別の方法、単一のキャストを使用しない。
(キャストが許可されていないJPA 2.0を使用している場合)
select col from yourtable
order by length(col),col
編集:正の整数でのみ機能します
並べ替える列には、アルファベットと数字の任意の組み合わせがあるため、この投稿の提案を出発点として使用し、これを思いつきました。
DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');
SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;
結果
ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002
お役に立てれば
別の簡単な方法
ORDER BY ABS(column_name)
変換する別の方法。
文字列フィールドがある場合は、次の方法でそのフィールドまたはその数値部分を変換できます。先行ゼロを追加して、すべての整数文字列を同じ長さにします。
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( stringfield ) ) , stringfield )
または、「tensymbols13」、「tensymbols1222」などのようなフィールドの一部による順序付け.
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) )
これは私のために動作します。
select * from tablename
order by cast(columnname as int) asc
私は、文字の接頭辞を持つソートフィールドも探していました。ここに私が解決策を見つけたものがあります。これは、同じソリューションを探している人に役立つかもしれません。
フィールド値:
FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789
select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc
SUBSTRING(field,3,9)
9を入れたのは、最大9桁の整数値を保持するには9で十分だからです。
結果は123456789 123456788 123456787 ... 100 99 ... 2 1
これは負の数、分数、文字列、すべてを処理します:
ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;