2017-09-06 129 views
0

我有一个Mysql表名xyz,它具有两列tc_name和tc_path,其中tc_path与/ a/b/c/x/tc_name和tc_name为空。我想要使用此tc_path列值将值插入列(tc_name)中。 我知道它会像我们用其他语言的正则表达式那样做。但是我不知道如何在Mysql中执行此操作。 I信号源功能:根据同一表中的另一列更新表中的列

DELIMITER $$ 
CREATE FUNCTION `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
DETERMINISTIC 
BEGIN 
DECLARE temp VARCHAR(1000); 
DECLARE ch VARCHAR(1); 
DECLARE i INT; 
SET i = 1; 
SET temp = ''; 
IF original REGEXP pattern THEN 
    loop_label: LOOP 
    IF i>CHAR_LENGTH(original) THEN 
    LEAVE loop_label; 
    END IF; 
    SET ch = SUBSTRING(original,i,1); 
    IF NOT ch REGEXP pattern THEN 
    SET temp = CONCAT(temp,ch); 
    ELSE 
    SET temp = CONCAT(temp,replacement); 
    END IF; 
    SET i=i+1; 
    END LOOP; 
ELSE 
    SET temp = original; 
END IF; 
RETURN temp; 
END$$ 

我尝试这样做:

update testplans set tc_name=regex_replace('.*/','',tc_path); 

应该给我tc_name = d如果tc_path =/A/B/C/d 但相反,它给了我ABCD 。 我使用了错误的功能,或者我不知道如何使用它。 请为它提供一些查询。

请帮忙!!!

感谢

回答

0

特殊情况下,如果你想获得一个路径的最后一部分,你可以跳过正则表达式,并使用简单的字符串功能:以相反的顺序

update testplans set tc_name=substr(tc_path, length(tc_path)-locate('/',reverse(tc_path))+2); 

否则搜索

适当的正则表达式表达将是

.*/([^/]*) 

但是,你需要提取最后一部分,MySQL真的不这样做。 MariaDB 10有一个REGEXP_REPLACE可能有帮助。

+0

这工作。谢谢 – confused

0

你有以上将替代匹配正则表达式是单个字符的功能,但它不是一个完整的正则表达式替换。基本上,功能错误。

目前,Mysql并不擅长 - 你可能想要考虑另一条路径,就像雅克建议的那样,用一个简单的字符串替换。

如果你真的想要一个正则表达式的解决方案,可能看一个更完整的正则表达式库对MySQL: https://github.com/mysqludf/lib_mysqludf_preg

+0

无论如何我不能使用这个函数来服务我的目的吗? – confused

+0

您想要一次替换多个字符。此功能替换单个字符。正如你发现的那样,唯一能匹配'。* /'模式的单个字符是'/',所以结果是斜线被替换。 –

相关问题