我读了关于regexp的mysql文档,但看起来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]+)
的选择查询是很好的,它给了我作为输出:
+------+------------+-------+----------+
| type | collection | model | material |
+------+------------+-------+----------+
| ART | 2830 | 107 | 70 |
| ART | 2832 | 115 | 6 |
+------+------------+-------+----------+
请注意,type, collection, model and material
列不存在于我的表中,而仅仅是上面regexp的匹配。
这可能吗?
p。s:我知道这将是一个伟大的想法,常态化该表添加一列为每个属性我需要,但这是我必须工作的结构,我不能编辑这个时刻。
编辑只是以防有人需要这个,我看到PostgreSql提供了这个功能
一般来说,答案是"不"——至少在没有大量暴力编码的情况下是这样。但是,你很幸运,因为你可以在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
好吧,也许不是最明显的函数集合。下面是它对model的作用:
开头:ART-2830--107-70
substring_index(sku, '-', 4) --> ART-2830--107
reverse()
:
701 - 0381 -交易
外层substring_index( . . . 1)
:
701
和最终的reverse()
:
107
在select语句中使用regex实际上取决于sql语言。对于MySql,您可以在手册中阅读更多相关内容。
手册的这一部分讨论如何使用正则表达式select语句:http://dev.mysql.com/doc/refman/5.7/en/regexp.html。该手册页还提供了以下链接,用于示例如何使用regex语句用于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语句的美好理想相去甚远。
如果您打算使用正则表达式捕获组来提取数据,那么这将需要在您收到数据后完成。