如何在 MYSQL 中用空白字符串替换最后出现的子字符串?我在 MYSQL 中找不到任何这样的直接函数
字符串: “American Corp National Corp”
搜索字符串: “公司”
预期输出: “American Corp National”
有人可以建议吗?
这更短,更易读:
SELECT TRIM(TRAILING 'Corp' FROM 'American Corp National Corp')
尝试:
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 )
在自己研究了这个问题并阅读了上面的答案之后,我创建了以下函数来解决这个问题。就我而言,我需要更改序列中的最后一个分隔符,例如,“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
这是一个 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
这感觉像是一种糟糕的方法,但是......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)
接受的答案不会替换@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”
更简单可靠
CONCAT(SUBSTRING_INDEX('American Corp National Corp','Corp',2), "REPLACE_STRING" ,SUBSTRING_INDEX('American Corp National Corp','Corp',-1))
REPLACE_STRING 你可以用替换字符串来改变它,也可以用空来替换。
如果您有最新版本的MySQL (>= v8) / MariaDB (>= v10.0.5),您可以使用REGEXP_REPLACE
替换最后一次出现的needle
with replacement
,如下所示:
REGEXP_REPLACE(haystack, "^.*needle", "\\1replacement")
这利用了*
.
如果您使用的是 MySQL,并且知道(或可以计算)出现次数,则可以使用可选occurence
参数.REGEXP_REPLACE