在Mysql中从具有相同模式的单个字符串中提取多个值

时间:2018-01-08 18:05:36

标签: mysql substring

我在Mysql的单个字符串中有一个分隔文本块,我需要解析。该块如下所示

BGN|1
TST|12345|5
END|1
BGN|2
TST|22345|6
END|2
BGN|3
TST|67554|7
END|3

我想在TST之后立即将值123452234567554提取到单独的记录中(不连接),因此结果看起来像

12345
22345
64554

我能够使用Locate值解析字符串,但我不确定如何使用single locate命令从数据中获取多个值。在SQL Server中,这对我来说没有问题。

编辑:我意识到我可能在循环中使用substring_index但是我宁愿不在字符串中运行循环。

1 个答案:

答案 0 :(得分:0)

这个解决方案怎么样:

SELECT
    SUBSTRING(REPLACE(SUBSTRING_INDEX(c, '|', 2), SUBSTRING_INDEX(c, '|', 1), ''), 2) AS 'TST'
FROM
    test_data
WHERE SUBSTRING_INDEX(c, '|', 1) = 'TST';

<强> 输出

+-------+
| TST   |
+-------+
| 12345 |
| 22345 |
| 67554 |
+-------+

使用mysql's SUBSTRING_INDEX函数,您可以在分隔符(|)计数出现之前从字符串中提取子字符串,并与REPLACESUBSTRING结合使用,您可以提取所需的值。

或者,如果您的第二个字段具有固定长度,则:

SELECT
    SUBSTRING(c, 5, 5) AS 'TST'
FROM
    test_data
WHERE SUBSTRING(c, 1, 3) = 'TST';

查看demo here

test_data表如下所示:

CREATE TABLE test_data (c TEXT);

INSERT INTO test_data(c) VALUES
('BGN|1'),
('TST|12345|5'),
('END|1'),
('BGN|2'),
('TST|22345|6'),
('END|2'),
('BGN|3'),
('TST|67554|7'),
('END|3');