如何替换MYSQL中最后一次出现的子串?

时间:2013-03-21 09:05:37

标签: mysql database

如何在MYSQL中用空字符串替换最后一个子字符串?我在MYSQL中找不到任何这样的直接函数

字符串:" American Corp National Corp"

搜索字符串:" Corp"

预期产出:" American Corp National"

有人可以建议吗?

7 个答案:

答案 0 :(得分:4)

这更短,更易读:

SELECT TRIM(TRAILING 'Corp' FROM 'American Corp National Corp')

答案 1 :(得分:2)

尝试:

select reverse(concat(
               left(reverse('American Corp National Corp'),
                    instr(reverse('American Corp National Corp'),reverse('Corp'))-1),
               substr(reverse('American Corp National Corp'),
                      instr(reverse('American Corp National Corp'),reverse('Corp'))+
                      length('Corp')))) result

SQLFiddle

答案 2 :(得分:0)

这感觉就像一种糟糕的方式,但是... reverse字符串,使用reverse搜索搜索字符串locate的第一次出现,然后计算什么索引会在非反转字符串中?

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_reverse

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_locate

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_char-length(非常确定您需要使用此而不是长度才能兼容unicode,但请务必确认!)

工作示例:

字符串:0123456789(char_length = 10)

搜索字符串:567(char_length = 3)

反向字符串:9876543210

反向搜索字符串:765

找到返回索引= 2

真实字符串中的结尾索引= 7(char_length(字符串) - 1 - 索引 - > 10 - 1 - 2)

真实字符串中的起始索引= 5(char_length(字符串) - 1 - (char_length(搜索字符串) - 1) - 索引 - > 10 - 1 - (3 - 1) - 2)

答案 3 :(得分:0)

在自己研究这个问题并阅读上面的答案之后,我创建了以下函数来解决这个问题。在我的情况下,我需要更改序列中的最后一个分隔符,例如," Aap,Noot,Mies"会成为" Aap,Noot&密斯":

CREATE DEFINER=`root`@`localhost` FUNCTION `change_last_substring`(
    input_string text,  
    separator_old tinytext, 
    separator_new tinytext
) RETURNS text CHARSET utf8
BEGIN

set @output_string=
trim(
    leading separator_new from
    concat
    (
        left(input_string,length(input_string)-length(substring_index(input_string,separator_old,-1))-2),
        separator_new,
        substring_index(input_string,separator_old,-1)
    )
);

RETURN @output_string;

END

答案 4 :(得分:0)

accepted answer不会将@FROM替换为@TO,而是将@FROM替换为空字符串。如果您需要将@FROM替换为@TO,请修改以下答案:

SELECT reverse(
           concat(
               concat(
                   left(reverse(value),
                        instr(reverse(value), reverse(@FROM)) - 1),
                   @TO
                 ),
               substr(reverse(value),
                      instr(reverse(value), reverse(@FROM)) +
                      length(@FROM))))
FROM `table`
WHERE `value` like '%' + @FROM + '%'

请注意附加的WHERElike '%' + @FROM + '%',因为如果值中没有出现子字符串,例如,这会删除多余的字符。尝试在“ ccc”中将“ a”替换为“ b”会导致“ cc”

答案 5 :(得分:0)

选择   相反(     CONCAT(       剩下(         反向(列),         位置(           REVERSE('您要替换的字符串')IN REVERSE(列)         )),         REVERSE('要替换的字符串'),         对(           反向(列),           长度(列)-位置(             REVERSE('您要替换的字符串')IN REVERSE(消息)           )-LENGTH('您要替换的字符串')+ 1)         )       )       从         桌子;

答案 6 :(得分:0)

更简单,更可靠

CONCAT(SUBSTRING_INDEX('American Corp National Corp','Corp',2), "REPLACE_STRING" ,SUBSTRING_INDEX('American Corp National Corp','Corp',-1))

REPLACE_STRING,您可以使用替换字符串进行更改,也可以将其替换为空。