MySQL:使用正则表达式从一条记录中提取所有匹配项

3

我想从字符串中提取所有标签,并将它们添加到mysql的新列中,例如:

string :

hello #name# , current time is : #time# and today is : #today_date#

output :

#name#
#time#
#today_date#

我希望能够搜索表格中所有行的 text 列,并将输出结果更新到 tags_list 列。
要查找具有标签的所有行,我们可以使用以下查询。
SELECT `text` FROM 'table' WHERE `text` REGEXP '#.*#' 

但如何提取所有匹配项并使用输出结果更新tags_list列?

结果值应如何分布到tag_list列中? - RomanPerekhrest
@RomanPerekhrest 这并不重要,tag_list只是用来向管理员展示标签信息的,以便知道哪些标签可以用于该文本。 - MrUnknow
@DragandDrop 1- 是的,2- 是的,4- 文本只是一条消息,并且标签被正确的值替换(每个消息都不同) - MrUnknow
我觉得你在寻找前瞻和后顾。 - Drag and Drop
@DragandDrop 我对正则表达式模式没有任何问题!这个模式工作得很好:'#.*?#' 我的问题是:如何从MySQL中的字符串中提取所有的值。 - MrUnknow
显示剩余2条评论
1个回答

0
BEGIN
  DECLARE tags_list varchar(2000) ;
  DECLARE tags varchar(800) ;

  SET @start_loc := 1;
  SET @start_pos := -1;
  SET @end_pos := -1;

  SET @total_len =  LENGTH(str);

  WHILE @start_loc < @total_len
  DO

    SET @start_pos := LOCATE('#',str,@start_loc);
    SET @end_pos := LOCATE('#',str,@start_pos+1 );


    IF @start_pos > 1 AND @end_pos > 0 THEN
      SET @len = @end_pos - @start_pos + 1;


      SET tags := SUBSTRING(str, @start_pos, @len);
    IF  tags_list IS NULL THEN
        SET tags_list :=  tags;
    ELSE
      set tags_list  := CONCAT_WS("
", tags_list, tags);
    END IF;
        SET @start_loc := @end_pos+1;
    ELSE
      SET @start_loc := @total_len+1;
    END IF;

  END WHILE;


  IF  tags_list IS NULL THEN
        SET tags_list :=  '';
  END IF;

  RETURN tags_list;
END

然后用于更新列
UPDATE `table` SET `tags_list`= func_name(`text`) 

或许对某人有用...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接