2017-09-06 169 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

您想要一次替換多個字符。此功能替換單個字符。正如你發現的那樣,唯一能匹配'。* /'模式的單個字符是'/',所以結果是斜線被替換。 –

相關問題