所以我有一张横幅表,在那张桌子上有一个字段告诉我他们应该在哪些网站上展示,就像一个穷人的关系表。
Banner.jpg | ABC,CDE,FGH
Banner2.jpg | IPO,IPOMON,IPOHLM
等等。我使用find_in_set()
收集特定网站的横幅广告。
现在,我想编写一个替换这些值的脚本,比如" ABC"应该是" XZY"。所以我运行这个:
update banners set sites = replace(sites, 'ABC', 'XZY')
这是一个完成的交易。但是,如果我想改变" IPO"到" APO"例如,因为这个查询:
update banners set sites = replace(sites, 'IPO', 'APO')
会产生这些数据:
Banner.jpg | XYZ,CDE,FGH
Banner2.jpg | APO,APOMON,APOHLM
这是不受欢迎的。那么我该如何改变" IPO"而不是" IPOMON"在做replace()
或类似的功能时?我想要一个" replace_in_set()"功能可以这么说。
有什么想法吗?
答案 0 :(得分:3)
您可以使用这样的查询。首先它在集合的开头和结尾添加一个','。然后你可以改变你的设置,TRIM删除','。
UPDATE banners
SET sites = TRIM(BOTH ',' FROM REPLACE( CONCAT(',',sites,','), ',IPO,', ',APO,') );
答案 1 :(得分:1)
我不认为有一个很好/漂亮的方法来做到这一点。为了使IPO成为单一的IPO并将IPO作为列表的一部分而改变,您必须做这样的事情。
UPDATE banners SET
sites = REPLACE(sites,
IF(sites LIKE '%IPO,%', 'IPO,', 'IPO'),
IF(sites LIKE '%IPO,%', 'APO,', 'APO')
);
要抓住的东西越多,IF
必须越复杂,但你明白了。
答案 2 :(得分:0)
您应该将表格规范化,以便在字段上使用UPDATE
,其值等于您想要的替换值。看一下这个例子:
/* create the banner data table and add banner.jpg and banner2.jpg */
CREATE TABLE banner
(`banner_id` int, `description` varchar(11))
;
INSERT INTO banner
(`banner_id`, `description`)
VALUES
(1, 'banner.jpg'),
(2, 'banner2.jpg')
;
/* create the website data table and:
ABC, CDE, FGH, IPO, IPOMON, and IPOHLM */
CREATE TABLE website
(`site_id` int, `banner_id` int, `site` varchar(6))
;
INSERT INTO website
(`site_id`, `banner_id`, `site`)
VALUES
(1, 1, 'ABC'),
(2, 1, 'CDE'),
(3, 1, 'FGH'),
(4, 2, 'IPO'),
(5, 2, 'IPOMON'),
(6, 2, 'IPOHLM')
;
/* update the website data table to change IPO to APO */
UPDATE `website`
SET `site` = "APO"
WHERE `site` = "IPO";
SELECT * FROM `website`
小提琴:Live Demo
答案 3 :(得分:0)
你可以使用'IPO,'
update banners set sites = replace(sites, 'IPO,', 'APO,')
答案 4 :(得分:0)
我给了Bernd Buffin的答案+1,因为它至少完成了替换而没有将数据提取到应用程序中以拆分和重新加入字符串。
以下内容并未回答您的问题,但我认为我会将其发布在此处,以便将来让其他读者受益。
我尝试在MySQL 8.0.4中测试新的REGEXP_REPLACE()函数,因为我认为以下内容可行,但它没有:
mysql> SELECT REGEXP_REPLACE('IPO,IPOMON,IPOHLM', '[[:<:]]IPO[[:>:]]', 'APO');
ERROR 3686 (HY000): Illegal argument to a regular expression.
MySQL changed their regexp library in 8.0.4和新图书馆不支持[[:<:]]
[[:>:]]
字边界模式。