1

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

V12.0
V1.0
BE0.50
VV24

我想查询更大的版本n。我要进行比较的数字前面是不固定数量的字符。是否可以执行以下操作:

SELECT version FROM table WHERE int_part(version) > 10

V12.0
VV24
4

3 回答 3

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;

希望能帮助到你...

于 2012-12-14T09:49:54.900 回答
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                  |
+---------------------+
于 2012-12-14T09:55:58.743 回答
0

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

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

@shubhansh

24 不会更改为 0.24 并且失败 > 12 吗?

于 2012-12-14T09:51:52.847 回答