【问题标题】:How to extract specifc part from a string in MySQL如何从 MySQL 中的字符串中提取特定部分
【发布时间】:2022-02-07 10:10:52
【问题描述】:

我正在尝试从 MySQL 中的字符串中提取特定部分,但是我无法正确提取它。

模式如下:

-MB|{field_1}-AA|{field_2}-BB|{field_3}

这是一个例子

-MB|string1-AA|string2-BB|string3

我编写了以下代码来提取最后一个字段,但它不是动态的,只有在我们有特定数量的字母/数字时才会起作用:

SELECT 
    test_string,
    SUBSTRING(test_string, LOCATE( '|', test_string) + 1 - LOCATE( '|', test_string) - 9) as string3
FROM test_table;

输出是整个字符串,然后是它的最后一部分:

string3

话虽如此,有人可以建议一种我可以用来提取的语法吗:

  • 第一个 | 之间的值第二个 |
  • 第二个|之间的值第三个 |
  • 还有一种更好的方法来提取第三个之后的所有内容|

提前谢谢你!

【问题讨论】:

标签: mysql sql substring


【解决方案1】:

如果你只想要最后一个字符串,你可以先REVERSE()这个字符串,然后找到|,然后用它在反转的字符串上做SUBSTRING()。然后再次反转它以获得原始字符串细绳。如果您使用不带子查询的 SUBSTRING(),则总共有三个 REVERSE()

SELECT test_string,
       REVERSE(SUBSTRING(REVERSE(test_string),1,LOCATE('|',REVERSE(test_string))-1))
 FROM test_table;

如果您使用子查询,您可以将REVERSE() 的使用量减少到两个,尽管查询时间更长:

SELECT test_string,
       REVERSE(SUBSTRING(rvstr,1,LOCATE('|',rvstr)-1))
  FROM
(SELECT test_string,
       REVERSE(test_string) rvstr
 FROM test_table) a;

但您可以避免所有这些,只需使用 SUBSTRING_INDEX

SELECT test_string,
       SUBSTRING_INDEX(test_string, '|', -1)
 FROM test_table;

您可以使用相同的函数来提取由分隔符分隔的其他字符串,方法如下:

SELECT test_string,
       SUBSTRING_INDEX(SUBSTRING_INDEX(test_string,'|',1),'|',-1) AS 'Str1',
       SUBSTRING_INDEX(SUBSTRING_INDEX(test_string,'|',2),'|',-1) AS 'Str2',
       SUBSTRING_INDEX(SUBSTRING_INDEX(test_string,'|',3),'|',-1) AS 'Str3'
 FROM test_table;

至于“提取3号之后所有内容的方法”,我觉得有点棘手,但也许:

SELECT test_string,
        Str1,Str2,Str3,
        SUBSTRING(test_string,LENGTH(CONCAT(Str1,Str2,Str3))+4) AS 'StrAfter3rd'
 FROM
(SELECT test_string,
       SUBSTRING_INDEX(SUBSTRING_INDEX(test_string,'|',1),'|',-1) AS 'Str1',
       SUBSTRING_INDEX(SUBSTRING_INDEX(test_string,'|',2),'|',-1) AS 'Str2',
       SUBSTRING_INDEX(SUBSTRING_INDEX(test_string,'|',3),'|',-1) AS 'Str3'
 FROM test_table) v;

获取Str1Str3 的串联结果中的LENGTH(),重新添加原始| 中的3 个,并在第四个字符串之前加上最后一个|(总共+4),然后将其用于SUBSTRING()

Demo fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2014-09-13
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多