使用自定義函數(如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