我将数字保存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
如何使它按数字升序显示?
Answers:
如果可能,则无论如何仅存储数字,应将列的数据类型更改为数字。
如果您不能这样做,则将列值integer
强制转换为
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 */
1
decimal
。
另一种方法,不使用单个强制转换。
(对于使用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
这可能会有助于寻找相同解决方案的人。
select * from tablename ORDER BY ABS(column_name)
如果您使用的是AdonisJS,并且具有混合ID(例如ABC-202,ABC-201 ...),则可以将原始查询与Query Builder结合使用,并实施上述解决方案(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