mysql ORDER BY最接近的数字,如abs()

时间:2014-02-07 13:55:58

标签: mysql

我需要使用mysql按$ NumValue = 85排序列表。也可以使用abs()

1.25
2.jaban 60
3.india america 70
4.85 africa
5.105
6.syriya sudan uk and 135 us egypt

其结果应如下所示。请帮帮我。

1.85 africa
2.india america 70
3.105
4.jaban 60
5.syriya sudan uk and 135 us egypt
6.25

1 个答案:

答案 0 :(得分:3)

SELECT * 
FROM Mytable 
ORDER BY ABS(MyFieldThatContainsNumber - 85) ASC

只要您需要排序的数字在其自己的字段中且不包含在字符串中,您就可以使用上述查询。

如果不是这种情况,并且上面显示的数据只是一个字段中的字符串,那么在执行上述查询之前,您必须解析出要比较的数字。

修改

你正在处理糟糕的设计。但是如果你坚持让它离开,SQL Fiddle演示了以下代码:

CREATE TABLE Mytable (MyField varchar(50));

INSERT INTO Mytable (MyField) VALUES
('25'),
('jaban 60'),
('india america 70'),
('85 africa'),
('105'),
('syriya sudan uk and 135 us egypt');



CREATE FUNCTION `uExtractNumberFromString`(in_string varchar(50)) 
 RETURNS INT
 LANGUAGE SQL
BEGIN

DECLARE ctrNumber varchar(50);
DECLARE finNumber varchar(50) default ' ';
DECLARE sChar varchar(2);
DECLARE inti INTEGER default 1;

IF length(in_string) > 0 THEN

WHILE(inti <= length(in_string)) DO
  SET sChar = SUBSTRING(in_string, 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 CAST(finNumber AS SIGNED INTEGER) ;
ELSE
  RETURN 0;
END IF;
END//

SELECT * 
FROM Mytable 
ORDER BY ABS(uExtractNumberFromString(MyField) - 85) ASC