174

VARCHARMySQL データベースに数値を保存しています。INTその他諸事情によりお作りできません。

並べ替え中に数字ではなく文字としてそれらを取得しています。

私が持っているデータベースで

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

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

1 10 2 3 4 5 6 7 8 9

番号の昇順で表示するにはどうすればよいですか?

4

11 に答える 11

312

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

それができない場合は、列の値をinteger 明示的にキャストします

select col from yourtable
order by cast(col as unsigned)

または暗黙的に、たとえば数値への変換を強制する数学演算を使用して

select col from yourtable
order by col + 0

ところで、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 */
于 2012-08-04T12:15:44.993 に答える
21

私が並べ替えている列には、英字と数字の任意の組み合わせがあるため、この投稿の提案を出発点として使用し、これを思いつきました.

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

お役に立てれば

于 2015-10-15T02:41:37.273 に答える
4

文字のプレフィックスを持つ並べ替えフィールドも探していました。これが私が解決策を見つけたものです。これは、同じソリューションを探している人に役立つかもしれません。

フィールド値:

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 になります。

于 2016-02-05T04:22:09.850 に答える
4

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

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;
于 2018-03-30T23:43:50.810 に答える
-4

フィールドを VARCHAR ではなく INT に変更します。

諸事情によりINTにできません。

次に、依存する状況を最初に修正します。それ以外の場合は、実際の根本的な問題を回避しています。MySQL CAST を使用することはオプションですが、修正する必要がある不適切なスキーマをマスクしています。

于 2015-11-18T11:34:35.480 に答える