使用自定义函数(如alphas
找到here),可以先通过值的数字部分,然后按值的字符串部分对其进行排序。
如果您定义和填充一个表作为这样的:
CREATE TABLE test (t VARCHAR(255));
INSERT INTO test VALUES
('10A'),
('2'),
('2A'),
('4'),
('10'),
('1');
然后创建一个名为alphas
自定义函数,用于提取部分字符串(无编号):
DELIMITER |
DROP FUNCTION IF EXISTS alphas;
CREATE FUNCTION alphas(str CHAR(32)) RETURNS CHAR(16)
BEGIN
DECLARE i, len SMALLINT DEFAULT 1;
DECLARE ret CHAR(32) DEFAULT '';
DECLARE c CHAR(1);
SET len = CHAR_LENGTH(str);
REPEAT
BEGIN
SET c = MID(str, i, 1);
IF c REGEXP '[[:alpha:]]' THEN
SET ret=CONCAT(ret,c);
END IF;
SET i = i + 1;
END;
UNTIL i > len END REPEAT;
RETURN ret;
END |
DELIMITER ;
然后,你可以做一个像这样排序的查询:
SELECT t FROM test ORDER BY CAST(t AS UNSIGNED), alphas(t);
该CAST
函数将字符串10A
转换为无符号数10
。
[这里的东西很相似,只是反转字符串数字计算](http://stackoverflow.com/questions/4939518/sorting-string-column-containing-numbers-in-sql)。最大的问题是,你不知道这个数字有多长。 – Draken