如排序前:
排序后:
解决方案:(思路是使用一个FUNCTION函数将此字段的数字取出,然后按照此数值进行排序)
(1).创建一个虚拟表:
select * from (
select '龙湖小区12号楼' AS building_name UNION ALL
select '龙湖小区06号楼' UNION ALL
select '龙湖小区19号楼' UNION ALL
select '龙湖小区33号楼' UNION ALL
select '龙湖小区2号楼' UNION ALL
select '龙湖小区66号楼'
) tb;
(2).创建mysql函数GetNum(field):
DELIMITER $$
CREATE FUNCTION GetNum (Varstring varchar(50))
RETURNS varchar(30)
BEGIN
DECLARE v_length INT DEFAULT 0;
DECLARE v_Tmp varchar(50) default '';
set v_length=CHAR_LENGTH(Varstring);
WHILE v_length > 0 DO
IF (ASCII(mid(Varstring,v_length,1))>47 and ASCII(mid(Varstring,v_length,1))<58 ) THEN
set v_Tmp=concat(v_Tmp,mid(Varstring,v_length,1));
END IF;
SET v_length = v_length - 1;
END WHILE;
RETURN REVERSE(v_Tmp);
END$$
DELIMITER ;
(3).调用GetNum(field)函数,并没有实现数字排序
select * from (
select '龙湖小区12号楼' AS building_name UNION ALL
select '龙湖小区06号楼' UNION ALL
select '龙湖小区19号楼' UNION ALL
select '龙湖小区33号楼' UNION ALL
select '龙湖小区2号楼' UNION ALL
select '龙湖小区66号楼'
) tb order by GetNum(building_name);
(4).原因是GetNum(field)得到的也是字符型的,所以要对目标字段+0实现排序.
select * from (
select '龙湖小区12号楼' AS building_name UNION ALL
select '龙湖小区06号楼' UNION ALL
select '龙湖小区19号楼' UNION ALL
select '龙湖小区33号楼' UNION ALL
select '龙湖小区2号楼' UNION ALL
select '龙湖小区66号楼'
) tb order by GetNum(building_name) + 0;
PS:对纯数字的字符类型字段进行排序:可以直接将字段*1或者+0可以将MySQL纯数值字符类型字段进行排序.