[英]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
基於此答案:
您想要這樣的東西,它與組匹配:
WHERE REGEXP 'second:([0-9]*):third'
但是,MySQL沒有正則表達式替換功能,因此您必須使用用戶定義的功能:
REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]])
用戶定義的功能在此處可用:
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.