mysql - varchar 类型列的排序依据

标签 mysql sql sql-order-by

我有以下列strand,它按升序排列,但它在 3.1 而不是 3.2 之后将 3.10 作为下一个......

该列是varchar类型..

 Strand
 3.1
 3.1.1
 3.1.1.1
 3.1.1.2
 3.1.2
 3.1.2.1
 3.10       # wrong  
 3.10.1     # wrong
 3.10.1.1   # wrong
 3.2        <- this should have been after 3.1.2.1
 3.2.1
 3.2.1.1
 ..
 3.9
 3.9.1.1
         <- here is where 3.10 , 3.10.1 and 3.10.1.1 should reside

我使用以下查询来订购它;

SELECT * FROM [table1]
ORDER BY RPAD(Strand,4,'.0') ;

如何确保其顺序正确,使得 3.10、3.10.1 和 3.10.1.1 位于最后

最佳答案

试试这个:

DROP TABLE T1;
CREATE TABLE T1 (Strand VARCHAR(20));
INSERT INTO T1 VALUES ('3.1');
INSERT INTO T1 VALUES('3.1.1');
INSERT INTO T1 VALUES('3.1.1.1');
INSERT INTO T1 VALUES('3.1.1.2');
INSERT INTO T1 VALUES('3.2');
INSERT INTO T1 VALUES('3.2.1');
INSERT INTO T1 VALUES('3.10');
INSERT INTO T1 VALUES('3.10.1');

SELECT * FROM T1 
ORDER BY STRAND;


SELECT *
  FROM T1 
  ORDER BY 
    CAST(SUBSTRING_INDEX(CONCAT(Strand+'.0.0.0.0','.',1) AS UNSIGNED INTEGER) *1000 +
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Strand,'.0.0.0.0'),'.',2),'.',-1)  AS UNSIGNED INTEGER) *100 +
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Strand,'.0.0.0.0'),'.',3),'.',-1) AS UNSIGNED INTEGER) *10 +
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Strand,'.0.0.0.0'),'.',4),'.',-1)  AS UNSIGNED INTEGER)

输出未排序:

    Strand
1   3.1
2   3.1.1
3   3.1.1.1
4   3.1.1.2
5   3.10
6   3.10.1
7   3.2
8   3.2.1

输出排序:

    Strand
1   3.1
2   3.1.1
3   3.1.1.1
4   3.1.1.2
5   3.2
6   3.2.1
7   3.10
8   3.10.1

关于mysql - varchar 类型列的排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42947308/

相关文章:

php - 警告 : mysql_fetch_array() expects parameter 1 to be resource, 中给出的 bool 值

php - 从数据库获取最后一个 ID 到字符串/Int 变量

php - 使用一条语句从多个表中删除多个mysql行

php - 按 DESC/ASC 排序在 PHP 查询中不起作用

sql - 如何查找列中的连续值

SQL 按每组的局部最大值对结果进行排序

mysql - str_to_date(date_format(sysdate() ,'%d-%b-%Y') ,'%d-%b-%Y')-max(ren_date)>=7 附近的语法错误

php - 我的 php/sql 脚本中出现错误?

postgresql - 按 UUID 排序在 PostgreSQL 中如何工作?

MySQL TRIM order by 子句中的前导空格问题