如何按数字,长度和字母对SQL进行排序?
我应该如何整理我的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.
如何对它进行排序,使其如上所示出现?
像这样:
$query = "SELECT * FROM table WHERE column1 = '$var' ORDER BY CAST(column2 as UNSIGNED), column2";
工程就像一个魅力。谢谢! –
我很高兴能帮到你。 –
顺序由十六进制是做到这一点的最佳方式:
$query = "SELECT *, cast(hex(column2 as unsigned) as l FROM table WHERE column1 = '$var' ORDER BY l"
;
使用自定义函数(如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://*.com/questions/4939518/sorting-string-column-containing-numbers-in-sql)。最大的问题是,你不知道这个数字有多长。 – Draken