在Varchar列中选择大于特定值的值

时间:2012-06-08 12:34:48

标签: mysql

我在Varchar列中有一些文本,它总是以一些数字结尾,例如:

abc12
xy2
asdf876
qwerty32

我需要选择这些数字大于某个数字x的那些值, 例如,如果x = 20,结果应为:

asdf876
qwerty32

我可以在MySQL中这样做吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

首先 - 需要这样的操作表明数据库结构从一开始就是错误的。

您可以编写一个函数,从字符串中提取数字序列,将其转换为数字,然后进行所需的操作。

例如 - 使用正则表达式(使用附加库已经解决了这个问题)。

如果添加库太难了 - 你可以编写一个函数,从字符串和子字符串中找到数字的第一个出现位置。

答案 1 :(得分:0)

在谷歌上搜索后,我找到了一个用功能解决这个问题的人:

mysql> DELIMITER |
mysql> CREATE FUNCTION digits( str CHAR(32) ) RETURNS CHAR(32)
    -> BEGIN
    ->   DECLARE i, len SMALLINT DEFAULT 1;
    ->   DECLARE ret CHAR(32) DEFAULT '';
    ->   DECLARE c CHAR(1);
    ->   SET len = CHAR_LENGTH( str );
    ->   REPEAT
    ->     BEGIN
    ->       SET c = MID( str, i, 1 );
    ->       IF c BETWEEN '0' AND '9' THEN 
    ->         SET ret=CONCAT(ret,c);
    ->       END IF;
    ->       SET i = i + 1;
    ->     END;
    ->   UNTIL i > len END REPEAT;
    ->   RETURN ret;
    -> END |
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

并使用它:

mysql> select * from t1 where actor_id > digits('ABCDefg199');
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|      206 | a          | b         | 0000-00-00 00:00:00 |
|      200 | THORA      | TEMPLE    | 2012-05-22 15:12:26 |
+----------+------------+-----------+---------------------+
2 rows in set (0.12 sec)

来源:http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#815