我有一个包含版本信息的字段,例如:
V12.0
V1.0
BE0.50
VV24
我想查询更大的版本n
。我要进行比较的数字前面是不固定数量的字符。是否可以执行以下操作:
SELECT version FROM table WHERE int_part(version) > 10
V12.0
VV24
在这种情况下,版本号似乎只出现在末尾,字母在开头。因此,可能的解决方案是反转字符串,键入强制转换以获取数字,然后反转获得的数字。
尝试以下解决方案
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;
希望能帮助到你...
似乎您必须创建自己的函数才能执行此操作:
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 |
+---------------------+
MySQL 的一大缺点是不支持 REPLACE 方法中的正则表达式。如果我必须进行任何类型的匹配,我通常会将所有数据提取到我的 PHP 并在那里进行处理。从长远来看,这是更好的解决方案。当然,如果您愿意,您总是可以使用用户定义的函数。
http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html
@shubhansh
24 不会更改为 0.24 并且失败 > 12 吗?