如果匹配,mysql替换最后一个字符

时间:2014-01-26 15:59:48

标签: mysql sql

我有一个名为media的表,其中一列名为accounts_used,其中的行以下列格式显示

68146, 67342, 60577, 61506, 67194, 67034, 63484, 49113, 61518, 66971, 67511, 
67351, 63621, 67725, 63638, 68141, 66114, 67262, 67537, 67537, 61765, 63701, 
67087, 62641, 61294, 67063, 67049, 67038, 67170, 67147, 67289, 61264, 67091, 
63690, 63505, 63505, 49172, 52313, 67070, 66945, 67234, 62265, 61368, 67870, 
67211, 67586, 49240, 67538, 67538, 67809, 67183, 67164, 62712, 67519, 66895, 
67693, 60266, 60266, 67593, 67031, 67137, 62570, 60682, 61195, 67569, 67569, 
67069, 62082, 67345, 61748, 61553, 52029, 66877, 62630, 67196, 67196, 67196, 
67196, 67196, 67196, 66873, 63677, 68174, 67127, 63594, 67107, 60419, 66601, 
68156, 67203, 68161, 60233, 66586, 52654, 63570, 66887, 67191, 60877, 52108, 
67131, 61784, 67566, 67162, 67073, 67092, 67064, 60133, 66907, 67559, 66846, 
60490, 60347, 66558, 48737, 61539, 67236, 68135, 67238 , 63656, 67585, 67512

如果行末尾有逗号,我想删除它,例如,如果行如下所示

1,2,3,4,5,6,

我想将其替换为此

1,2,3,4,5,6

这可以仅使用简单的查询吗?

2 个答案:

答案 0 :(得分:2)

在行中存储ID列表是个坏主意。但是,你正在这样做。您可以通过执行以下操作来解决此问题:

update media
    set accounts_used = left(accounts_used, length(accounts_used) - 1)
    where accounts_used = '%,';

相反,您应该有一个MediaAccounts表,每个“媒体”有一行,每个帐户有一行。

编辑:

可能该行以', '而不是逗号结尾:

update media
    set accounts_used = left(accounts_used, length(accounts_used) - 2)
    where accounts_used = '%, ';

答案 1 :(得分:0)

我们遇到了类似的字符串替换问题,其中包含大量的书目条目数据集,我们还需要从存储在数据库中的大量字符串中修剪无关的标点符号,这些字符串是从另一个系统逐字导入的。我们数据集中的许多记录也包含Unicode字符,因此我们需要找到一个合适的SQL查询,以便我们找到需要更新的相关记录,然后以Unicode(多字节)的方式更新它们在MySQL下兼容。

在使用我们的数据集测试时,我发现使用MySQL的LEFT()RIGHT()子串方法搜索我们需要更新的相关记录,比使用LIKE模式执行得更好 - 匹配查询。另外,MySQL的LENGTH()方法返回字符串中的字节数,而不是字符数,并且在处理可能包含多字节字符序列的字符串字段时,区别很重要,因为MySQL的子字符串方法对数字进行操作要选择的字符,而不是字节数。因此,在我们的情况下,使用LENGTH()方法不起作用,其中许多受测试的字符串包含多字节字符。这些要求导致UPDATE查询,格式如下:

UPDATE media
SET accounts_used = LEFT(accounts_used, CHAR_LENGTH(accounts_used) - 1)
WHERE RIGHT(accounts_used, 1) = ',';

查询选择media表中accounts_used列以逗号,结尾的记录(在此处使用WHERE RIGHT(accounts_used, 1) = ','子句执行过滤{ {1}}方法从提供的字符串/列的右侧开始返回指定长度的子字符串,然后使用RIGHT()方法调用执行字符串修剪操作,此处修剪{{1}中的最后一个字符1}}列值,其中LEFT(accounts_used, CHAR_LENGTH(accounts_used) - 1)返回从提供的字符串/列的左侧开始的指定长度的子字符串。)

由于数据集中包含多字节字符的无数记录,因此使用多字节感知accounts_used方法 - 而不是基本LEFT()方法 - 在我们的案例中非常重要。如果您只处理ASCII编码或其他单字节编码字符集,那么CHAR_LENGTH()方法将完美地工作,实际上在这种情况下LENGTH()LENGTH()将返回相同的长度计数,甚至可以互换使用。处理可能包含多字节字符的数据时,或者如果有疑问,请使用CHAR_LENGTH()方法,因为在任何一种情况下都会返回准确的字符长度计数。

请注意,上面示例查询中使用的列名和字段名与原始问题中提到的名称相匹配,应根据需要进行修改,以满足您自己的数据集需求。