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

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

点赞 strrchr 在 php 中

要获得最后一次出现的 _(下划线),我需要传递长度。这里是 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

标签: mysql string


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-23
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2021-01-10
      相关资源
      最近更新 更多