MYSQL:查找字符串中字符的最后一次出现
Posted
技术标签:
【中文标题】MYSQL:查找字符串中字符的最后一次出现【英文标题】:MYSQL : Find the last occurrence of a character in a string 【发布时间】:2017-10-31 19:06:42 【问题描述】:长度将是动态的,我想在 mysql 中的字符串中最后一次出现字符之前查找数据
点赞 strrchr 在 php 中
mysql> SELECT SUBSTRING_INDEX ('this_is_something_here', '_', 3); +-------------------------------------------------- ---+ | SUBSTRING_INDEX ('this_is_something_here', '_', 3) | +-------------------------------------------------- ---+ | this_is_something | +-------------------------------------------------- ---+要获得最后一次出现的 _(下划线),我需要传递长度。这里是 3
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 | +-------------------------------------------------- ----------+在这里,要获得最后一次出现的 _(下划线),我需要传递长度。这里是 6
我想要在上例中显示的 _(下划线)最后出现之前的数据字符串,但不传递长度。
注意:从上面的例子中,我想要在“_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:查找字符串中字符的最后一次出现的主要内容,如果未能解决你的问题,请参考以下文章