繁体   English   中英

MYSQL - 如何从字符串中提取数字值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM