Mysql:使用regexp匹配作为字段?

时间:2013-06-17 12:26:22

标签: mysql sql regex database

我看了mysql documentation about regexp,但看起来正则表达式只能用作WHERE过滤器来匹配SELECT查询中的行。

我想知道是否可以将regexp的匹配作为列提取,例如,如果在我的表中我有一个SKU文本字段:

+----------------+--------------+---------------+
|sku             | product_name | [other fields]|
+----------------+--------------+---------------+
|ART-2830--107-70| Foo          |               |
|ART-2832--115-6 | Bar          |               |
+----------------+--------------+---------------+

激发一个匹配regexp (ART-)([0-9]+)(--)([0-9]+)(-)([0-9]+)的select查询会很棒,这个查询会将我作为输出:

+------+------------+-------+----------+
| type | collection | model | material |
+------+------------+-------+----------+
| ART  | 2830       | 107   | 70       |
| ART  | 2832       | 115   | 6        |
+------+------------+-------+----------+

请注意,type, collection, model and material列不在我的表格中,而只是上面正则表达式的匹配。

这可能吗?

ps:我知道规范化该表为我需要的每个属性添加一个列是一个很好的想法,但这是我必须使用的结构,我不能在那一刻。

编辑为了防止有人需要,我看到了PostgreSql offer this function

2 个答案:

答案 0 :(得分:4)

答案通常是“不” - 至少在没有大量强力编码的情况下也是如此。但是,你很幸运,因为你可以在MySQL中轻松地做你想做的事情:

select substring_index(sku, '-', 1) as type,
       reverse(substring_index(reverse(substring_index(sku, '-', 2)), '-', 1)) as collection,
       reverse(substring_index(reverse(substring_index(sku, '-', 4)), '-', 1)) as model,
       reverse(substring_index(reverse(substring_index(sku, '-', 5)), '-', 1)) as material
from skus

好吧,也许不是最明显的功能集合。但这就是它对模型的作用:

从:ART-2830--107-70

开始
substring_index(sku, '-', 4) --> ART-2830--107

reverse()

701--0381-TRA

substring_index( . . . 1)

701

最后reverse()

107

答案 1 :(得分:0)

在select语句中使用regex实际上取决于sql语言。对于MySql,您可以在手册中阅读更多内容。

本手册的这一部分讨论了如何使用正则表达式选择语句:http://dev.mysql.com/doc/refman/5.7/en/regexp.html。该手册页还提供了以下链接,以获取如何在where语句中使用正则表达式语句的示例。

http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

此示例也在手册中。

To find names containing a “w”, use this query:

mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

您可以根据正则表达式捕获组返回数据吗?

没有。 where语句过滤SQL引擎返回的数据。您需要为要返回的每列数据构建一个条目。正如在Gordon Linoff的回答中,每列都可以由SQL处理,以手动从给定列中提取数据。但是这个解决方案远非使用正则表达式来描述sql select语句的美好理想。

我打算使用正则表达式捕获组来提取数据,然后在收到数据后需要这样做。