mysql 中的子字符串正则表达式匹配

Substring regex matching in mysql

我有一个复杂的问题困扰了我几个小时,并寻求 mysql 专家的帮助。 :) 先谢谢你了。

Table : t1 ;栏目:姓名

给定 table:

name
-----
$abc|def|$cde
efd|$acd
$gcb|$bvv|ggg

预期结果(只拉取不带$前缀的字符串,管道表示字段值分隔符):

name
-----
def
efd
ggg
-- Sql to create and insert
create table t1 (name varchar(100));
        insert into t1 (name) values ('$abc|def|$cde');
        insert into t1 (name) values ('efd|$acd');
        insert into t1 (name) values ('$gcb|$bvv|ggg');

Mysql版本:5.6.40

在 MySQL 8+ 上,您可以尝试:

SELECT
    col,
    REGEXP_REPLACE(CONCAT('|', col, '|'), '^.*\|([a-z]+)\|.*$', '') AS col_out
FROM yourTable;

这里的想法是从这个稍微修改过的列值开始:

|$abc|def|$cde|

然后,我们搜索一个被管道包围的纯字母序列,并用捕获的组替换。

Demo

SELECT DISTINCT
       name, SUBSTRING_INDEX(SUBSTRING_INDEX(t1.name, '|', num), '|', -1) one_value
FROM t1
/* max 3 subnames per name - expand if needed */
CROSS JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3) numbers
HAVING one_value NOT LIKE '$%';

fiddle