MYSQL:查找字符串中字符的最后一次出现

Posted

技术标签:

【中文标题】MYSQL:查找字符串中字符的最后一次出现【英文标题】:MYSQL : Find the last occurrence of a character in a string 【发布时间】:2017-10-31 19:06:42 【问题描述】:

长度将是动态的,我想在 mysql 中的字符串中最后一次出现字符之前查找数据

点赞 strrchrphp

要获得最后一次出现的 _(下划线),我需要传递长度。这里是 3

mysql> SELECT SUBSTRING_INDEX ('this_is_something_here', '_', 3); +-------------------------------------------------- ---+ | SUBSTRING_INDEX ('this_is_something_here', '_', 3) | +-------------------------------------------------- ---+ | this_is_something | +-------------------------------------------------- ---+

在这里,要获得最后一次出现的 _(下划线),我需要传递长度。这里是 6

mysql> SELECT SUBSTRING_INDEX ('and_this_may_go_like_this_too', '_', 6); +-------------------------------------------------- ----------+ | SUBSTRING_INDEX ('and_this_may_go_like_this_too', '_', 6) | +-------------------------------------------------- ----------+ | and_this_may_go_like_this | +-------------------------------------------------- ----------+

我想要在上例中显示的 _(下划线)最后出现之前的数据字符串,但不传递长度。

注意:从上面的例子中,我想要在“_here”和“_too”的数据之前

最后出现的_(下划线)

是否有任何内置功能可以在 MySQL 中实现这一点?

提前感谢各位朋友。

【问题讨论】:

你想在上面找到“这里”和“太”吗? 不,我要在“这里”和“太”的数据之前 这个什么的? 来自示例 1:this_is_something 从示例 2 开始:and_this_may_go_like_this 【参考方案1】:

我不太了解您的示例,但我认为您想要传递 -1 作为长度并预先添加子字符串。

比较

strrchr('and_this_may_go_like_this_too', '_'); // Returns _too

SELECT SUBSTRING_INDEX('and_this_may_go_like_this_too', '_', -1);
-- Returns too, just need to concatenate `_` so...
SELECT CONCAT('_', SUBSTRING_INDEX('and_this_may_go_like_this_too', '_', -1));
-- Returns _too

如果您要查找字符串 before 到针头的部分,并且 不是 从针头到字符串末尾的部分,您可以使用:

SET @FULL_STRING = 'this_is_something_here';  

SELECT LEFT(@FULL_STRING, LENGTH(@FULL_STRING) - LOCATE('_', REVERSE(@FULL_STRING)));
-- Returns this_is_something

请注意,第二个语句不是 strrchr 所做的那样。

【讨论】:

我想要在上例中显示的 _(下划线)最后出现之前的数据字符串,但没有传递长度。 来自示例 1:this_is_something 没有传递长度 那不完全是strrchr(因为它会返回匹配的匹配项直到字符串的末尾),您介意更新问题吗? @AdityaShah 您的输出是从字符串的开头到子字符串的最后一次出现。那不一样。如果您正在寻找它,SQL 将是 SET @FULL_STRING = 'this_is_something_here'; SELECT LEFT(@FULL_STRING, LENGTH(@FULL_STRING) - LOCATE('_', REVERSE(@FULL_STRING)));,但又是这样,而不是 strrchr 这太荒谬了...然后创建一个包含我们的脚本的标量函数哈哈【参考方案2】:
select reverse(substr(reverse('this_is_something_here'), 1+locate('_', reverse('this_is_something_here'))));

【讨论】:

【参考方案3】:

使用反向,定位,右然后替换而不使用长度

Set @str = 'there_is_something';

Select replace(@str,right(@str,locate('_',reverse(@str))),'');

【讨论】:

哟狗,我听说OP只喜欢一个函数......所以我把你的函数放在一个函数里。 CREATE FUNCTION just_one_function(_in LONGTEXT) RETURNS LONGTEXT DETERMINISTIC NO SQL RETURN REPLACE(_in,RIGHT(_in,LOCATE('_',REVERSE(_in))),''); SELECT just_one_function('this_works_well');this_works 是的,就像我从另一个答案中所说的那样。 OP不完整【参考方案4】:

你可以这样写查询

SELECT SUBSTRING_INDEX('and_this_may_go_like_this_too','_',(LENGTH('and_this_may_go_like_this_too')-LENGTH(REPLACE('and_this_may_go_like_this_too' ,'_',''))) - 1);

【讨论】:

以上是关于MYSQL:查找字符串中字符的最后一次出现的主要内容,如果未能解决你的问题,请参考以下文章

查找字符串中子字符串最后一次出现的索引

查找字符串中最后一次出现的数字,并按该值拆分字符串

strrchr — 查找指定字符在字符串中的最后一次出现

strrchr — 查找指定字符在字符串中的最后一次出现

XSLT:查找字符串中的最后一次出现

使用 boost 字符串查找最后一次出现