我需要使用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
答案 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