mysql - 使用正则表达式将一列拆分为多列

标签 mysql regex

我有一个表格和一些数据:

-- 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 查询。

这些列应命名为 ABC

结果应该类似于:

+------+-----+------+
| 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/

相关文章:

c++ - 正则表达式与 C++ 不匹配

sql - 将 SQL 数据库与 MySQL 数据库链接/同步

mysql:在事件日志中查找开始结束时间 - 按 session 时间分组

mysql - 无法为插入查询绑定(bind)多部分标识符

javascript - 需要一个正则表达式来检查字符串中的 "2 alphabets and 4 numeric"

javascript - 正则表达式替换表达式字符串中 JavaScript 中的整个单词

javascript - 正则表达式 - "-"、 "."、 "/"之后的所有数字

Python正则表达式匹配多次

php - 按首字母分组,按字母顺序排列,最好的方法是什么?

mysql - 在没有锁定的情况下设置MySql主从复制?