版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39198406/article/details/83543648
原文:https://blog.csdn.net/oyezhou/article/details/81665643
另外一篇类似的:https://blog.csdn.net/haijiege/article/details/79460236
创建一个Num_char_extract.sql
文件,内容如下,在mysql shell
中使用source
执行,这样就新建了一个函数。
DELIMITER $$
DROP FUNCTION IF EXISTS `Num_char_extract`$$
CREATE FUNCTION `Num_char_extract`(Varstring VARCHAR(100)CHARSET utf8, flag INT) RETURNS VARCHAR(50) CHARSET utf8
BEGIN
DECLARE len INT DEFAULT 0;
DECLARE Tmp VARCHAR(100) DEFAULT '';
SET len=CHAR_LENGTH(Varstring);
IF flag = 0
THEN
WHILE len > 0 DO
IF MID(Varstring,len,1)REGEXP'[0-9]' THEN
SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));
END IF;
SET len = len - 1;
END WHILE;
ELSEIF flag=1
THEN
WHILE len > 0 DO
IF (MID(Varstring,len,1)REGEXP '[a-zA-Z]')
THEN
SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));
END IF;
SET len = len - 1;
END WHILE;
ELSEIF flag=2
THEN
WHILE len > 0 DO
IF ( (MID(Varstring,len,1)REGEXP'[0-9]')
OR (MID(Varstring,len,1)REGEXP '[a-zA-Z]') )
THEN
SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));
END IF;
SET len = len - 1;
END WHILE;
ELSEIF flag=3
THEN
WHILE len > 0 DO
IF NOT (MID(Varstring,len,1)REGEXP '^[u0391-uFFE5]')
THEN
SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));
END IF;
SET len = len - 1;
END WHILE;
ELSE
SET Tmp = 'Error: The second paramter should be in (0,1,2,3)';
RETURN Tmp;
END IF;
RETURN REVERSE(Tmp);
END$$
DELIMITER ;
mysql> source /tmp/tmpcode/Num_char_extract.sql
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.15 sec)
测试效果
mysql> select Num_char_extract("123中国ABC",0);
+------------------------------------+
| Num_char_extract("123中国ABC",0) |
+------------------------------------+
| 123 |
+------------------------------------+
1 row in set (0.06 sec)
mysql> select Num_char_extract("123中国ABC",2);
+------------------------------------+
| Num_char_extract("123中国ABC",2) |
+------------------------------------+
| 123ABC |
+------------------------------------+
1 row in set (0.00 sec)
mysql> select Num_char_extract("123中国ABC",3);
+------------------------------------+
| Num_char_extract("123中国ABC",3) |
+------------------------------------+
| 中国 |
+------------------------------------+
1 row in set (0.00 sec)
mysql> insert into t2(name) values("1500万人民币元"),("300美元"),("54648万人民币"),("855598万日元");
Query OK, 4 rows affected (0.14 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select name from t2;
+---------------------+
| name |
+---------------------+
| 1500万人民币元 |
| 300美元 |
| 54648万人民币 |
| 855598万日元 |
+---------------------+
4 rows in set (0.00 sec)
mysql> select name,Num_char_extract(name,3) from t2;
+---------------------+--------------------------+
| name | Num_char_extract(name,3) |
+---------------------+--------------------------+
| 1500万人民币元 | 万人民币元 |
| 300美元 | 美元 |
| 54648万人民币 | 万人民币 |
| 855598万日元 | 万日元 |
+---------------------+--------------------------+
4 rows in set (0.00 sec)