MySql仅选择数字并从varchar列中对它们进行排序

时间:2017-02-28 12:13:13

标签: mysql

我有一个名为year varchar(100)的列表。此列可以包含

等数据
 Year
-------
 1901
   0
 circa 12580
 125d4 great
 year 1012
 3411 standard
 12
  saf
 1234

现在我想通过查找Year字段中的前4位来按Year升序或降序排序。我想:

  1. 只获取那些有4位或更多位数的列(单独或带有 一些字符串)
  2. 提取前4位数(如果超过4位或带有一些整数)或获得4位数(如果列只有4位数值)
  3. 基于以上两个条件的结果集排序
  4. 我希望我的结果集按升序排列:

    Year
    1012
    1234
    1258
    1901
    3411
    

    反之亦然。

    我试过以下:

     SELECT * 
     FROM table 
     WHERE YEAR REGEXP '^[0-9]+$' AND LENGTH(YEAR) = 4 
     ORDER BY CAST(YEAR AS UNSIGNED) DESC;
    

    但是这只返回只有4位数的列和它们的订单,但不是我上面提到的结果。

1 个答案:

答案 0 :(得分:1)

这就是我解决问题的方法。我创建了一个存储函数,得到了here(来自Ushastry的回复)的帮助,看起来像

CREATE FUNCTION `get_numeric`(`year` VARCHAR(50)) RETURNS INT(11)
            NO SQL
        BEGIN
            DECLARE ctrNumber VARCHAR(50);
            DECLARE finNumber VARCHAR(50) DEFAULT ' ';
            DECLARE sChar VARCHAR(2);
            DECLARE inti INTEGER DEFAULT 1;
                IF LENGTH(year) > 0 THEN
                    WHILE(inti <= LENGTH(year)) DO
                        SET sChar= SUBSTRING(year,inti,1);
                                SET ctrNumber= FIND_IN_SET(sChar,'0,1,2,3,4,5,6,7,8,9');

                                IF ctrNumber > 0 THEN
                            SET finNumber=CONCAT(finNumber,sChar);
                                ELSE
                            SET finNumber=CONCAT(finNumber,' ');
                                END IF;
                        SET inti=inti+1;
                    END WHILE;
                    RETURN finNumber;
                ELSE
                    RETURN 'Invalid';
                END IF;
        END

然后跟随查询按预期工作

 SELECT id, YEAR, SUBSTRING(`get_numeric`(YEAR),1,4) AS act_year FROM table HAVING LENGTH(act_year) = 4 ORDER BY act_year ASC;