7

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

字符串: “American Corp National Corp”

搜索字符串: “公司”

预期输出: “American Corp National”

有人可以建议吗?

4

8 回答 8

7

这更短,更易读:

SELECT TRIM(TRAILING 'Corp' FROM 'American Corp National Corp')
于 2014-04-02T07:29:07.327 回答
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 )

于 2013-03-21T09:25:05.147 回答
1

在自己研究了这个问题并阅读了上面的答案之后,我创建了以下函数来解决这个问题。就我而言,我需要更改序列中的最后一个分隔符,例如,“Aap, Noot, Mies”将变为“Aap, Noot & Mies”:

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
于 2017-10-28T11:21:51.407 回答
1

这是一个 SQL 查询:

select CONCAT(SUBSTRING_INDEX('<TEST_STRING>','<String that you want to replace>',(length('<TEST_STRING>') - length(replace('<TEST_STRING>', '<String that you want to replace>', '')))),'<String to be replaced>',SUBSTRING_INDEX('<TEST_STRING>', '<String that you want to replace>', -1)) as test
于 2019-06-27T08:07:17.327 回答
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(string) - 1 - index -> 10 - 1 - 2)

实际字符串中的开始索引 = 5 (char_length(string) - 1 - (char_length(search string) - 1) - index -> 10 - 1 - (3 - 1) - 2)

于 2013-03-21T09:10:36.350 回答
0

接受的答案不会替换@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 + '%'

注意WHERE附加值like '%' + @FROM + '%',因为如果子字符串没有出现在值中,这会删除一个额外的字符,例如在“ccc”中尝试用“b”替换“a”会导致“cc”

于 2019-02-23T06:20:45.887 回答
0

更简单可靠

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

REPLACE_STRING 你可以用替换字符串来改变它,也可以用空来替换。

于 2020-05-25T09:20:27.527 回答
0

如果您有最新版本的MySQL (>= v8) / MariaDB (>= v10.0.5),您可以使用REGEXP_REPLACE替换最后一次出现的needlewith replacement,如下所示:

REGEXP_REPLACE(haystack, "^.*needle", "\\1replacement")

这利用了*.

如果您使用的是 MySQL,并且知道(或可以计算)出现次数,则可以使用可选occurence参数.REGEXP_REPLACE

于 2021-12-06T20:59:51.567 回答