我有一个表格和一些数据:
-- Table
CREATE TABLE IF NOT EXISTS `myTable` (
`myColumn` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Data
INSERT INTO `myTable` (`myColumn`) VALUES
('AAA BBB CCC'),
('AA BB CCCC'),
('BBB CC AAAA'),
('C AAA BBB'),
('CCC AA BBB');
我想运行返回 3 列的 SELECT
查询。
这些列应命名为 A
、B
和 C
。
结果应该类似于:
+------+-----+------+
| A | B | C |
+------+-----+------+
| AAA | BBB | CCC |
| AA | BB | CCCC |
| AAAA | BBB | CC |
| AAA | BBB | C |
| AA | BBB | CCC |
+------+-----+------+
我有三个正则表达式,通过使用它们,可以匹配所有数据:
^([A]+) ([B]+) ([C]+)$
^([B]+) ([C]+) ([A]+)$
^([C]+) ([A]+) ([B]+)$
是否可以使用这些正则表达式来产生这样的结果?
如果是这样,希望有一个例子,即使只是问题的一个子集。
最佳答案
更新 - 2021 年 9 月
现在这是可能的。
MySQL 8.0以及MariaDB 10.0.5引入了对 REGEXP_SUBSTR 函数的支持,该函数对输入字符串应用正则表达式,并返回匹配部分(如果没有匹配则返回 NULL)。这比之前的 SUBSTRING_INDEX
方法更加强大和灵活。
在MySQL中使用此函数,可以通过以下查询解决原始问题:
SELECT regexp_substr(myColumn, '[A]+') AS `A`,
regexp_substr(myColumn, '[B]+') AS `B`,
regexp_substr(myColumn, '[C]+') AS `C`
FROM ...
旁注:捕获第 N 个匹配事件
MySQL 的 REGEXP_SUBSTR
接受第三个参数,指示要返回的出现次数。例如,要返回输入字符串中的第三个单词,可以编写:regexp_substr(myColumn, '[a-z]+', 3)
。然而 MariaDB 不支持这一点。
使用REGEXP_REPLACE
可以通过将原始模式扩展为一系列捕获组来实现相同的效果。例如,可以使用以下正则表达式来捕获输入字符串的第三个单词:
regexp_replace(myColumn, '^([a-z]+) ([a-z]+) ([a-z]+).*$', '\\3')
原始答案
这不能使用 MySQL 中的正则表达式来完成。不幸的是,MySQL 仅支持将正则表达式作为 bool 条件(特别是在 where 子句中),而不支持提取或更改字符串的内容。
但是,您可以使用 substring_index 完全通过 MySQL 查询实现您所描述的内容。 。以下是您的场景的示例用法。
SELECT substring_index(substring_index(myColumn, ' ', 1), ' ', -1) AS `A`,
substring_index(substring_index(myColumn, ' ', 2), ' ', -1) AS `B`,
substring_index( myColumn , ' ', -1) AS `C`
FROM ...
或者,如果您必须绝对使用正则表达式,那么您可以将 MySQL 的输出通过管道传输到某个正则表达式引擎。如果您需要有关此策略的更多信息,请询问我。
关于mysql - 使用正则表达式将一列拆分为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26498939/