MySQL中字符串数字部分的比较

时间:2012-12-14 09:04:27

标签: mysql sql

我有一个包含版本信息的字段,例如:

V12.0
V1.0
BE0.50
VV24

我想查询的版本大于n。我想要进行比较的数字前面是非固定数量的字符。是否可以做类似的事情:

SELECT version FROM table WHERE int_part(version) > 10

V12.0
VV24

3 个答案:

答案 0 :(得分:2)

在这种情况下,似乎版本号仅显示在结尾,字母表开头。因此,可能的解决方案是反转字符串,输入它以获取数字,然后反转获得的数字。

尝试以下解决方案

     SELECT   version
     FROM table
     HAVING CAST(REVERSE(IF(LOCATE(".", version), (CAST(REVERSE(version) AS DECIMAL(4,2))), (CAST(REVERSE(version) AS UNSIGNED INTEGER)))) AS DECIMAL(4,2)) > 12;

希望它有所帮助...

答案 1 :(得分:1)

似乎你必须创建自己的功能来执行此操作:

CREATE FUNCTION IsNumeric (val varchar(255)) RETURNS tinyint 
 RETURN val REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

CREATE FUNCTION NumericOnly (val VARCHAR(255)) 
 RETURNS VARCHAR(255)
BEGIN
 DECLARE idx INT DEFAULT 0;
 IF ISNULL(val) THEN RETURN NULL; END IF;

 IF LENGTH(val) = 0 THEN RETURN ""; END IF;

 SET idx = LENGTH(val);
  WHILE idx > 0 DO
  IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN
   SET val = REPLACE(val,SUBSTRING(val,idx,1),"");
   SET idx = LENGTH(val)+1;
  END IF;
  SET idx = idx - 1;
  END WHILE;
  RETURN val;
 END;

select NumericOnly('vv24');
+---------------------+
| NumericOnly('vv24') |
+---------------------+
| 24                  |
+---------------------+

答案 2 :(得分:0)

MySQL的大缺点是不支持REPLACE方法中的正则表达式。如果我必须进行任何匹配,我通常会将所有数据提取到PHP并在那里进行处理。从长远来看,这是更好的解决方案。当然,如果您愿意,可以随时使用用户自定义函数。

http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html

@shubhansh

24不会变为0.24并且失败> 12?