我有一个包含版本信息的字段,例如:
V12.0
V1.0
BE0.50
VV24
我想查询的版本大于n
。我想要进行比较的数字前面是非固定数量的字符。是否可以做类似的事情:
SELECT version FROM table WHERE int_part(version) > 10
V12.0
VV24
答案 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?