我有一个名为year varchar(100)
的列表。此列可以包含
Year
-------
1901
0
circa 12580
125d4 great
year 1012
3411 standard
12
saf
1234
现在我想通过查找Year
字段中的前4位来按Year
升序或降序排序。我想:
我希望我的结果集按升序排列:
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位数的列和它们的订单,但不是我上面提到的结果。
答案 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;