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

时间:2014-10-22 01:15:06

标签: 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]+)$

是否可以使用这些正则表达式来产生这样的结果?

如果是这样,请欣赏一个例子,即使只是问题的一个子集。

1 个答案:

答案 0 :(得分:1)

在MySQL中使用正则表达式无法做到这一点。不幸的是,MySQL支持regex只作为一个布尔条件(特别是在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的输出传递给某些正则表达式引擎。如果您需要有关此策略的更多信息,请询问我。