2011-11-07 57 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?