1

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

表:t1;栏目:名称

给定表:

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

4

2 回答 2

1
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 '$%';

小提琴

于 2020-11-19T08:26:59.137 回答
1

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

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

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

|$abc|def|$cde|

然后,我们搜索由管道包围的仅字母序列,并替换为捕获的组。

下面演示链接的屏幕截图

演示

于 2020-11-19T08:19:13.983 回答