[英]MYSQL - how to extract the number values from string?
我在数据库中得到了可能具有如下格式的字符串值:
hdpos1234x93m4s9034z1
ryhp5x908m4s1s
不幸的是,我没有使用REGEX_SUBSTR
函数的 MySQL 版本 8。 我试图在“x”之前和之后获取数字值。
所以我想要这些值。 任何见解都会很棒。
1234 93
5 908
很明显,您可以使用某种托管语言(例如 Python 或 PHP)阅读这些列,然后使用其正则表达式支持来执行您想要的操作。 要限制您需要读取的行,您可以使用RLIKE
函数(我知道它在 MySQL 5.6 中可用):
SELECT x FROM mytable WHERE x RLIKE '[0-9]x[0-9]'
这应该选择包含两个数字的行,这些数字由x
列中的x
分隔。 当然,您可以使用更适合您需求的不同模式。
以下函数在 pSteps(有符号)中离开 pLocate,直到 pString 与 pRegex 不匹配:
CREATE FUNCTION regexFromLocate( pString VARCHAR(255)
, pRegex VARCHAR(255)
, pLocate VARCHAR(255)
, pStep INT
) RETURNS VARCHAR(255)
BEGIN
DECLARE len INT DEFAULT length(pString);
DECLARE pos INT DEFAULT locate(pLocate,pString)+if(pStep>=0,length(pLocate),0);
DECLARE i INT DEFAULT 0;
DECLARE str VARCHAR(255);
DECLARE res VARCHAR(255);
REPEAT
SET res = str;
SET i = i+pStep;
SET str = if( pStep >= 0
, substring( pString, pos , i)
, substring( pString, pos+i, -i)
);
UNTIL ( ( pStep < 0 and i <= -pos )
OR ( pStep >= 0 and i >= len )
OR str not regexp pRegex
)
END REPEAT;
RETURN res;
END
例子:
mysql> SELECT regexFromLocate(string, '^[0-9]+$', 'x', -1) lNum
-> , regexFromLocate(string, '^[0-9]+$', 'x', 1) rNum
-> FROM ( SELECT 'hdpos1234x93m4s9034z1' string
-> UNION
-> SELECT 'ryhp5x908m4s1s'
-> ) t;
+------+------+
| lNum | rNum |
+------+------+
| 1234 | 93 |
| 5 | 908 |
+------+------+
2 rows in set (0.00 sec)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.