2016-09-30 247 views
1

我应该如何整理我的SELECT如何按数字,长度和字母对SQL进行排序?

示例列表

1, 2, 2A, 4, 10, 10A 

SQL

$query = "SELECT * FROM table WHERE column1 = '$var' ORDER BY length(column2), column2"; 

如果我ORDER BY length()像我的例子,2A将在底部结束。
如果我删除length(),则10之后出现1.

如何对它进行排序,使其如上所示出现?

+0

[这里的东西很相似,只是反转字符串数字计算](http://stackoverflow.com/questions/4939518/sorting-string-column-containing-numbers-in-sql)。最大的问题是,你不知道这个数字有多长。 – Draken

回答

0

像这样:

$query = "SELECT * FROM table WHERE column1 = '$var' ORDER BY CAST(column2 as UNSIGNED), column2"; 
+0

工程就像一个魅力。谢谢! –

+0

我很高兴能帮到你。 –

0

顺序由十六进制是做到这一点的最佳方式:

$query = "SELECT *, cast(hex(column2 as unsigned) as l FROM table WHERE column1 = '$var' ORDER BY l";

0

使用自定义函数(如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

相关问题