我读了mysql documentation about regexp但看起来正则表达式 只能用作 WHERE
过滤器 以匹配 SELECT
查询中的行。
我想知道是否可以将正则表达式的匹配提取为列,例如,如果我的表中有一个 SKU 文本字段:
+----------------+--------------+---------------+
|sku | product_name | [other fields]|
+----------------+--------------+---------------+
|ART-2830--107-70| Foo | |
|ART-2832--115-6 | Bar | |
+----------------+--------------+---------------+
触发一个与正则表达式匹配的选择查询会很棒 (ART-)([0-9]+)(--)([0-9]+)(-)([0- 9]+)
输出:
+------+------------+-------+----------+
| type | collection | model | material |
+------+------------+-------+----------+
| ART | 2830 | 107 | 70 |
| ART | 2832 | 115 | 6 |
+------+------------+-------+----------+
请注意,type、collection、model 和 material
列没有出现在我的表中,它们只是上面正则表达式的匹配项。
这可能吗?
p.s:我知道为我需要的每个 属性 添加一列来规范化该表是一个好主意,但这是我必须使用的结构,我无法在此刻。
编辑 为了以防万一有人需要这个,我看到了 PostgreSql offer this function .
最佳答案
总的来说答案是否定的——至少在没有大量强力编码的情况下是这样。但是,你很幸运,因为你可以在 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
关于Mysql:使用正则表达式匹配作为字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17147470/