如何提取在MySQL中某个字符之后出现的字符串?

时间:2019-03-14 23:48:02

标签: mysql sql regex

如果我有一个字符串:

'#name#user#user2#laugh#cry'

我想打印

name
user
user2
laugh
cry

所有字符串都不同,并且具有不同数量的'#'

我尝试过使用Regex,但无法正常工作。此查询必须采用什么逻辑?

1 个答案:

答案 0 :(得分:3)

首先要说的是,在许多方面,将分隔的值列表存储在文本列中并不是一个好的数据库设计。您应该基本上重新设计数据库结构,或者为可能带来的痛苦做好准备。

一种快速而肮脏的解决方案是使用数字表或内联suquery,并将其与表交叉连接; REGEXP_SUBSTR()(在MySQL 8.0中可用),使您可以选择特定模式的给定出现。

这是一个查询,将从列中提取最多10个值:

SELECT
    REGEXP_SUBSTR(t.val, '[^#]+', 1, numbers.n) name
FROM
    mytable t
    INNER JOIN (
        SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
        UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 
        UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
) numbers
    ON REGEXP_SUBSTR(t.val, '[^#]+', 1, numbers.n) IS NOT NULL

正则表达式[^#]+的意思是:除#以外的尽可能多的连续字符。


demo on DB Fiddle ,当给定输入字符串'#name#user#user2#laugh#cry'时,返回:

| name  |
| ----- |
| name  |
| user  |
| user2 |
| laugh |
| cry   |