VARCHAR
MySQL データベースに数値を保存しています。INT
その他諸事情によりお作りできません。
並べ替え中に数字ではなく文字としてそれらを取得しています。
私が持っているデータベースで
1 2 3 4 5 6 7 8 9 10...
私のページでは、次のような順序付きリストが表示されます。
1 10 2 3 4 5 6 7 8 9
番号の昇順で表示するにはどうすればよいですか?
VARCHAR
MySQL データベースに数値を保存しています。INT
その他諸事情によりお作りできません。
並べ替え中に数字ではなく文字としてそれらを取得しています。
私が持っているデータベースで
1 2 3 4 5 6 7 8 9 10...
私のページでは、次のような順序付きリストが表示されます。
1 10 2 3 4 5 6 7 8 9
番号の昇順で表示するにはどうすればよいですか?
とにかく数値のみを格納する場合は、可能であれば、列のデータ型を数値に変更する必要があります。
それができない場合は、列の値を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 */
私が並べ替えている列には、英字と数字の任意の組み合わせがあるため、この投稿の提案を出発点として使用し、これを思いつきました.
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
お役に立てれば
文字のプレフィックスを持つ並べ替えフィールドも探していました。これが私が解決策を見つけたものです。これは、同じソリューションを探している人に役立つかもしれません。
フィールド値:
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;
フィールドを VARCHAR ではなく INT に変更します。
諸事情によりINTにできません。
次に、依存する状況を最初に修正します。それ以外の場合は、実際の根本的な問題を回避しています。MySQL CAST を使用することはオプションですが、修正する必要がある不適切なスキーマをマスクしています。