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

l0oc07j2  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(258)

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

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

我想在tst之后立即提取值, 12345 , 22345 , 67554 转换为单独的记录(而不是串联),因此结果如下所示

12345
22345
64554

我能够使用locate值解析字符串,但我不确定如何使用单个locate命令从数据中获取多个值。在sql server中,这对我来说不是问题。
edit:我意识到我可能可以在循环中使用substring\u index,但我不希望在字符串中运行循环。

8fsztsew

8fsztsew1#

这个解决方案怎么样:

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 函数可以在计算分隔符的出现次数之前从字符串中提取子字符串( | )并与 REPLACE 以及 SUBSTRING 您可以提取所需的值。
或者如果第二个字段具有固定长度,则:

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

请看这里的演示。
哪里 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');

相关问题