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 */
1
decimal
。
もう1つの方法は、シングルキャストを使用しないことです。
(キャストが許可されていない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
お役に立てれば
1 - ISNUMERIC(ID)
代わりに(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
を使用して0を1に変更し、その逆も可能です。
これは私にとってはうまくいきます。
select * from tablename
order by cast(columnname as int) asc
変換する別の方法。
文字列フィールドがある場合、次の方法でフィールドまたはその数値部分を変換できます。先行ゼロを追加して、すべての整数文字列を同じ長さにします。
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( stringfield ) ) , stringfield )
または、「tensymbols13」、「tensymbols1222」など、フィールドの一部で並べ替えます。
ORDER BY CONCAT( REPEAT( "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) )
文字のプレフィックスが付いている並べ替えフィールドも探していました。これが私が解決策を見つけたものです。これは、同じソリューションを探している人を助けるかもしれません。
フィールド値:
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になります。
AdonisJSを使用していて、ABC-202、ABC-201 ...などのIDが混在している場合は、生のクエリをクエリビルダーと組み合わせて、上記のソリューションを実装できます(https://stackoverflow.com/a/25061144/4040835)次のように:
const sortField =
'membership_id'
const sortDirection =
'asc'
const subquery = UserProfile.query()
.select(
'user_profiles.id',
'user_profiles.user_id',
'user_profiles.membership_id',
'user_profiles.first_name',
'user_profiles.middle_name',
'user_profiles.last_name',
'user_profiles.mobile_number',
'countries.citizenship',
'states.name as state_of_origin',
'user_profiles.gender',
'user_profiles.created_at',
'user_profiles.updated_at'
)
.leftJoin(
'users',
'user_profiles.user_id',
'users.id'
)
.leftJoin(
'countries',
'user_profiles.nationality',
'countries.id'
)
.leftJoin(
'states',
'user_profiles.state_of_origin',
'states.id'
)
.orderByRaw(
`SUBSTRING(:sortField:,3,15)*1 ${sortDirection}`,
{
sortField: sortField,
}
)
.paginate(
page,
per_page
)
注:
この行ではSUBSTRING(:sortField:,3,15)*1 ${sortDirection}
、
参照1:生のクエリのパラメーターバインディングの詳細については、https://knexjs.org/#Raw-Bindingsを 参照してください。参照2:Adonisの生のクエリ:https : //adonisjs.com/docs/4.1/query-builder# _raw_queries