web-dev-qa-db-ja.com

数値としてのSQL順序文字列

VARCHARとしてMySQLデータベースに番号を保存しています。他の状況に応じて、それらをINTにすることはできません。

ソート中に、数値としてではなく文字としてそれらを使用しています。

データベースにあります

1 2 3 4 5 6 7 8 9 10...

私のページでは、次のような順序付きリストが表示されます。

1 10 2 3 4 5 6 7 8 9

数字の昇順で並べて表示するにはどうすればよいですか?

112
Jamol

とにかく数値のみを保存する場合は、可能であれば、列のデータ型を数値に変更する必要があります。

それができない場合、列値を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 */
213
juergen d

別の方法、単一のキャストを使用しない。

(キャストが許可されていないJPA 2.0を使用している場合)

select col from yourtable
order by length(col),col

編集:正の整数でのみ機能します

59
Velter

並べ替える列には、アルファベットと数字の任意の組み合わせがあるため、この投稿の提案を出発点として使用し、これを思いつきました。

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

お役に立てれば

15
Losbear

別の簡単な方法

ORDER BY ABS(column_name)

8
Parth Solanki

変換する別の方法。

文字列フィールドがある場合は、次の方法でそのフィールドまたはその数値部分を変換できます。先行ゼロを追加して、すべての整数文字列を同じ長さにします。

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

または、「tensymbols13」、「tensymbols1222」などのようなフィールドの一部による順序付け.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 
4
shukshin.ivan

これは私のために動作します。

select * from tablename
order by cast(columnname as int) asc
3

私は、文字の接頭辞を持つソートフィールドも探していました。ここに私が解決策を見つけたものがあります。これは、同じソリューションを探している人に役立つかもしれません。

フィールド値:

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

2
user2400083

これは負の数、分数、文字列、すべてを処理します:

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;
2
Amir