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|
然后,我们搜索一个被管道包围的纯字母序列,并用捕获的组替换。
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 '$%';
我有一个复杂的问题困扰了我几个小时,并寻求 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|
然后,我们搜索一个被管道包围的纯字母序列,并用捕获的组替换。
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 '$%';