1.字符串转成数字排序,直接后面+0
字段+0;
例如:
select code from user order by code+0 ASC;
2.字段是字符串但是字段前缀不同,首先根据前缀排序,然后根据前缀后面升序排序
建表并插入测试数据:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
— —————————-
— Table structure for t_differentprefix_sort
— —————————-
DROP TABLE IF EXISTS `t_differentprefix_sort`;
CREATE TABLE `t_differentprefix_sort` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
— —————————-
— Records of t_differentprefix_sort
— —————————-
INSERT INTO `t_differentprefix_sort` VALUES (1, ‘TYPEA-101’, ‘TYPEA’);
INSERT INTO `t_differentprefix_sort` VALUES (2, ‘TYPEA-102’, ‘TYPEA-‘);
INSERT INTO `t_differentprefix_sort` VALUES (3, ‘TYPEC-101’, ‘TYPEC’);
INSERT INTO `t_differentprefix_sort` VALUES (4, ‘TYPEC102’, ‘TYPEC’);
INSERT INTO `t_differentprefix_sort` VALUES (5, ‘TYPEB101’, ‘TYPEAB’);
INSERT INTO `t_differentprefix_sort` VALUES (6, ‘TYPEB-1003’, ‘TYPEAB’);
SET FOREIGN_KEY_CHECKS = 1;
查询:(注意这种包含的如果有被包含关系,要把字符串长的放前面,如:有AB和ABC,要把ABC放前面)
SELECT
id,name,type,
CASE
WHEN instr( NAME, “TYPEA-” ) > 0 THEN
REPLACE ( NAME, “TYPEA-“, “” )
WHEN instr( NAME, “TYPEB-” ) > 0 THEN
REPLACE ( NAME, “TYPEB-“, “” )
WHEN instr( NAME, “TYPEC-” ) > 0 THEN
REPLACE ( NAME, “TYPEC-“, “” )
END subsName
FROM
t_differentprefix_sort order by type ASC, subsName+0 ASC;