【问题标题】:Find multiple ids stored in a string in Mysql在Mysql中查找存储在字符串中的多个id
【发布时间】:2019-09-05 20:04:35
【问题描述】:

我有一个如下所示的字符串: pi_18944000_780345308_54210001000_345900_text

如何提取其中的所有 Id 并将其存储?

我尝试过这样的事情:


    set @a = (SELECT
      SUBSTRING(SUBSTRING(SUBSTRING('pi_18944000_780345308_54210001000_345900_text',
     (LOCATE('_', 'pi_18944000_780345308_54210001000_345900_text'))), 2), 1, 
    LOCATE('_', SUBSTRING(SUBSTRING('pi_18944000_780345308_54210001000_345900_text',
     (LOCATE('_', 'pi_18944000_780345308_54210001000_345900_text'))), 2)) - 1)
    ); 
    select @a;

set @b = (SELECT
  SUBSTRING(SUBSTRING(SUBSTRING(SUBSTRING(SUBSTRING(
  'pi_18944000_780345308_54210001000_345900_text'  , (  LOCATE('_',  'pi_18944000_780345308_54210001000_345900_text'  ))  ), 2),
  LOCATE('_', SUBSTRING(SUBSTRING(  'pi_18944000_780345308_54210001000_345900_text',  (  LOCATE('_', 'pi_18944000_780345308_54210001000_345900_text'
  ))), 2))), 2), 1, LOCATE('_', SUBSTRING(SUBSTRING(SUBSTRING(SUBSTRING(  'pi_18944000_780345308_54210001000_345900_text'  , (
  LOCATE(  '_',  'pi_18944000_780345308_54210001000_345900_text'  ))), 2),
  LOCATE('_',  SUBSTRING(SUBSTRING(  'pi_18944000_780345308_54210001000_345900_text',  (
  LOCATE('_',  'pi_18944000_780345308_54210001000_345900_text'  )))  , 2))), 2)) - 1) );

select @b;

这可行,但它确实很复杂。 只是想看看是否有更好的方法来做到这一点?

【问题讨论】:

  • 您所有的 ID 都是整数吗?字符串中的任何其他值都只是文本吗?
  • 你用的是什么版本的 MySQL?

标签: mysql regex string substring denormalized


【解决方案1】:

这里有一个更简单的解决方案。它使用SUBSTRING_INDEX() 内置函数。它只需要引用一次字符串表达式。

mysql> set @str = 'pi_18944000_780345308_54210001000_345900_text';

mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@str, '_', 3), '_', -1) AS n;
+-----------+
| n         |
+-----------+
| 780345308 |
+-----------+

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_substring-index

如果您需要在 SQL 表达式中引用单个 id,下次您应该考虑不要将多个 id 存储在一个字符串中。

【讨论】:

  • 打败我......我写的差不多就是这个。 +1
  • @Bill Karwin 这实际上有帮助! :)
  • 如果文本也有下划线,则此代码不起作用,例如:'pi_18944000_780345308_54210001000_345900_ab_toursnm_ju'。并且文本中下划线的数量可以不断变化。
  • 我测试了你刚才给出的字符串,查询输出'780345308'。你希望它输出什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多