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

标签 mysql sql regex string

如果,我有一个字符串:

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

我要打印,

name
user
user2
laugh
cry

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

我试过使用正则表达式,但它不起作用。此查询必须应用什么逻辑?

最佳答案

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

一个快速而肮脏的解决方案是使用数字表或内联查询,并将其与表交叉连接; 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

Regexp [^#]+ 表示:除了#之外,尽可能多的连续字符。


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

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

关于mysql - 如何提取MySQL中某个字符之后出现的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173640/

相关文章:

php - 如何在 php 中显示 blob 类型的图像?

SQL : transform union query to a single query

php - 导入带有 2 个合并列的 sql

mysql - 带聚合函数的子查询

Python,正则表达式 : find and replace all instances of "yyyy" except when in front of a period

javascript - 如何替换 js 堆栈跟踪以包含 "line"和 "position"文本?

sql - 如何在 MySQL 中执行 FULL OUTER JOIN?

php - unicode和丹麦语之间的utf8排序规则区别

MySQL 错误 : NOT IN + subquery using GROUP BY HAVING returns nothing

mysql - SQL,当一​​列的值为 A 或 B 时查找条目