例如,如果特定列中的所有条目都具有 [a-z]+[0-9]+ 形式,那么如何仅提取前导字母,以便 asdf123 和 as3456 分别返回“asdf”和“as”?

最佳答案

这对于 mysql regex 功能是不可能的(除非安装一些似乎是为此设计的 udf)。从技术上讲,由于 [0-9] 是一个有限的集合,您可以在 LOCATE 中抛出 10 个 LEAST (注意 & invaliddate 0),并使用 SUBSTRING 。不好看的图:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,
  LEAST(
    IF(LOCATE(0,@var)=0,LENGTH(@var),LOCATE(0,@var)),
    IF(LOCATE(1,@var)=0,LENGTH(@var),LOCATE(1,@var)),
    IF(LOCATE(2,@var)=0,LENGTH(@var),LOCATE(2,@var)),
    IF(LOCATE(3,@var)=0,LENGTH(@var),LOCATE(3,@var)),
    IF(LOCATE(4,@var)=0,LENGTH(@var),LOCATE(4,@var)),
    IF(LOCATE(5,@var)=0,LENGTH(@var),LOCATE(5,@var)),
    IF(LOCATE(6,@var)=0,LENGTH(@var),LOCATE(6,@var)),
    IF(LOCATE(7,@var)=0,LENGTH(@var),LOCATE(7,@var)),
    IF(LOCATE(8,@var)=0,LENGTH(@var),LOCATE(8,@var)),
    IF(LOCATE(9,@var)=0,LENGTH(@var),LOCATE(9,@var))
   ) -1 ) as 'result';
+---------+
| result  |
+---------+
| asjdasd |
+---------+

如果您需要它,请查看 udf。否则,您最好获取该字段并在 MySQL 之外对其进行操作。

编辑:如果数字适合整数 ,脏黑客可能会导致:
SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
+---------+
| result  |
+---------+
| asjdasd |
+---------+

关于mysql - 有没有办法从 MySQL 的列中提取与正则表达式匹配的文本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3312393/

10-14 19:41
查看更多