代码之家  ›  专栏  ›  技术社区  ›  jonderry

有没有办法从MySQL中的列中提取与正则表达式匹配的文本?

  •  4
  • jonderry  · 技术社区  · 16 年前

    3 回复  |  直到 16 年前
        1
  •  2
  •   Wrikken    16 年前

    这在mysql regex capabilities中是不可行的(除非安装一些udf,它似乎是为此而设计的)。从技术上讲,因为[0-9]是有限的一盘,你可以投10个 LOCATE 是的 LEAST (注意&无效日期(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 | 
    +---------+
    

    需要 看看自定义项。否则,最好获取字段并在MySQL之外对其进行操作。

    ,肮脏的黑客行为可能导致:

    SET @var ='asjdasd35433';
    SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
    +---------+
    | result  |
    +---------+
    | asjdasd |
    +---------+
    
        2
  •  1
  •   Mark Baker    16 年前
        3
  •  0
  •   Brendan Bullen    16 年前

    我没用过,但要回答你的问题:

    MySQL Regex

    从MySQL参考页:

    SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';
    

    编辑 仔细想想(正如下面的Mark所指出的),这只会返回字符串中是否包含文本。不是字符串的匹配部分。

    在进一步的搜索中,MySQL的基本regex函数似乎不具备这种功能。也许查询匹配的值,然后在MySQL之外执行比较就是答案?