2011-11-07 87 views
0

假設我有在MySQL以下逗號分隔的列值:foo,bar,baz,bar,foo2在MySQL中以逗號分隔的字符串替換值?

什麼是barAAA(讓我們改變foo,bar,baz,bar,foo2取代無論是在四號位(在這種情況下bar)這個字符串的最佳方式到foo,bar,baz,barAAA,foo2)?請注意0​​發生在位置2以及位置4.

我知道我可以使用SUBSTRING_INDEX()在MySQL中獲取位置4的任何值的值,但一直未能弄清楚如何替換位置4的值用新值。

我需要通過僅使用MySQL中的標準字符串函數(http://dev.mysql.com/doc/refman/5.5/en/string-functions.html)來創建UDF或存儲函數。

+0

可能重複[Mysql的選擇,其中以CSV字符串字段(http://stackoverflow.com/questions/4265463/mysql-select-採取where-field-in-csv-string) – MPelletier

+1

Gross。這就是上帝發明編程語言的原因。 – regality

+1

關係數據庫和逗號分隔的值並沒有真正混合。是否有可能改變你的模式,以適當規範化? – tadman

回答

2

嗯...也許這個?

SELECT @before := CONCAT(SUBSTRING_INDEX(`columnname`,',',3),','), 
     @len := LENGTH(SUBSTRING_INDEX(`columnname`,',',4)+1 
FROM `tablename` WHERE ...; 

SELECT CONCAT(@before,'newstring',SUBSTRING(`columnname`,@len+1)) AS `result` 
FROM `tablename` WHERE ...; 

根據需要替換的東西,但這應該只是做。

編輯:合併成一個查詢:

SELECT 
    CONCAT(
     SUBSTRING_INDEX(`columnname`,',',3), 
     ',newstring,', 
     SUBSTRING(`columnname`, LENGTH(SUBSTRING_INDEX(`columnname`,',',4)+1)) 
    ) as `result` 
FROM `tablename` WHERE ...; 

+1可能需要+2,我不知道,但應該工作。

+0

是否有可能使用單個SELECT語句並且不使用變量? – archmeta

+0

碰巧,是的,因爲每個變量只能使用一次。讓我編輯我的答案。 –

3

你先分成兩個部分你的問題:

  1. 找到逗號和分裂中以逗號分隔值的字符串。
  2. 用相同的字符串和附加的子字符串更新表。

在第一部分,我建議你看一看here

而對於第二部分,你應該看一看here

一兩件事是沒有捷徑的任何問題。你不應該從問題中解脫出來。把它作爲一個挑戰。在搜索答案時學習。最好的事情是從這裏接受指導,並嘗試做更多的研究和努力。

0

試試這個:

UPDATE yourtable 
    SET 
     categories = 
     TRIM(BOTH ',' FROM 
     REPLACE(
      REPLACE(CONCAT(',',REPLACE(col, ',', ',,'), ','),',2,', ''), ',,', ',') 
     ) 
    WHERE 
    FIND_IN_SET('2', categories) 

從這裏The best way to remove value from SET field?