2012-07-19 41 views
0

在我的桌子我有一個字符串是這樣的:MySQL正則表達式:如何使用子表達式替換字符串?

Quisque scelerisque, odio ut ornare faucibus - IR:5443_XP 
Maecenas eleifend felis in - IR:2077_XP 

在上面的字符串,我需要提取只有數字(5443,2077)和數據轉換爲這樣的事情:

Quisque scelerisque, odio ut ornare faucibus - Model ID = 5443 
Maecenas eleifend felis in - Model ID = 2077 

我在數據庫中有大量這些需要更改。我如何在MySQL中執行此操作?我不認爲MySQL的「REGEXP」功能足夠強大。我想我需要使用子表達式來存儲數字,然後檢索它們以將文本更新爲第二種格式。

我看過這個:http://www.mysqludf.org/lib_mysqludf_preg/但我無法讓它在我的xampp環境中運行。

+0

[UDF](https://launchpad.net/mysql-udf-regexp)呢? – hsz 2012-07-19 12:09:27

+0

@hsz是的,我也看過UDF,但我不確定如何使用它。是否需要安裝?你能告訴我如何使用它嗎?謝謝。 – user1448031 2012-07-19 12:18:49

回答

0

我可能會做這樣的事情沒有UDF。具有表結構像

SELECT 
    `text` AS 'original_text', 
    IF(`text` REGEXP '[[:<:]]IR:[0-9]+_XP$', 
     CONCAT(
      SUBSTRING_INDEX(`text`,CONCAT('IR:',SUBSTRING_INDEX(`text`,'IR:',-1)),1), 
      'Model ID = ', 
      SUBSTRING_INDEX(SUBSTRING_INDEX(`text`,'IR:',-1),'_',1 
     ) 
    ),`text`) AS 'modified_text' 
FROM `example_table` 

CREATE TABLE `example_table` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `text` text, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 

我不知道有多快或有效率,這將是,雖然。

編輯:

對不起,SELECT版本。這是UPDATE之一:

UPDATE `example_table` 
SET `text` = CONCAT(
    SUBSTRING_INDEX(`text`,CONCAT('IR:',SUBSTRING_INDEX(`text`,'IR:',-1)),1), 
    'Model ID = ', 
    SUBSTRING_INDEX(SUBSTRING_INDEX(`text`,'IR:',-1),'_',1) 
) 
WHERE `text` REGEXP '[[:<:]]IR:[0-9]+_XP$'; 
+0

如果你想讓它區分大小寫,你可能想在必要的地方使用'BINARY()',例如'WHERE'子句:'WHERE BINARY(\'text \')REGEXP ...' – inhan 2012-07-19 23:45:20

+0

Thanks for你的努力。這看起來不錯。但是如果多個紅外值出現在同一個表格單元格內,例如這是一個單元格的一部分,那該怎麼辦呢?「Quisque scelerisque,odio ut ornare faucibus - IR:5443_XP Maecenas eleifend felis in - IR:2077_XP」 – user1448031 2012-07-21 06:01:28

+0

@ user1448031您需要在這種情況下使用UDF。我根據你一貫的例子寫了答案。 – inhan 2012-07-21 11:23:51