簡體   English   中英

在mysql中使用正則表達式替換表中的列值

[英]Replace a column value in a table using regex in mysql

我需要執行以下操作,並且我在語法上苦苦掙扎:

我有一個名為“ mytable”的表和一個名為“ mycolumn”(字符串)的列。

在mycolumn中,該值為構造值-例如,其中一個值為:“ first:10:second:18:third:31”。 mycolumn中的值都使用相同的模式,只是id /數字不同。

我需要將值18(在這種情況下)更改為另一個表鍵的值。 該列值的最終結果應為“ first:10:second:22:third:31”,因為我用22替換了18。我從另一個表中獲取了22,並使用18作為查找值。

因此,理想情況下,我將具有以下內容:

UPDATE mytable 
SET mycolumn = [some regex function to find the number between 'second:' and ":third" - 
let's call that oldkey - and replace it with other id from another table - 
(select otherid from tableb where id = oldkey)].

我知道mysql有一個REPLACE函數,但是那還不夠。

您可以創建自己的函數。 我擔心REGEX,所以我使用SUBSTRING和SUBSTRING_INDEX。

CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
   LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
   delim, '');

SPLIT_STRING('first:10:second:18:third:31', ':', 4)

返回18

基於此答案:

等效於explode()以在MySQL中使用字符串

您想要這樣的東西,它與組匹配:

WHERE REGEXP 'second:([0-9]*):third'

但是,MySQL沒有正則表達式替換功能,因此您必須使用用戶定義的功能:

REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]])

用戶定義的功能在此處可用:

http://www.mysqludf.org/lib_mysqludf_preg/

MySQL的問題在於它的REGEX風格非常有限,並且不支持反向引用或regex替換,這幾乎使得無法像單獨使用MySQL那樣替換所需的值。

我知道這意味着加快速度,但是您可能要考慮通過其ID選擇想要的行,或者選擇該行,然后使用PHP或與MySQL接口的任何語言修改值,然后使用UPDATE查詢。

一般來說,編程語言中的REGEX功能要強大得多。

如果您將這些查詢保持精簡和快速,那么您不應受到太大的影響(可能忽略不計)。

另外,這里是有關MySQL的REGEX可以做什么的文檔。 http://dev.mysql.com/doc/refman/5.1/en/regexp.html

干杯

編輯:

坦白地說,eggyal的注釋對於您的情況(簡單的int值)更加有意義。 只需將它們分成幾列,就沒有理由像在所有imo上那樣訪問它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM