2016-09-30 284 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

相關問題