Mysql:使用正则表达式匹配作为字段?

标签 mysql sql regex database

我读了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/

相关文章:

php - 有没有更好的方法来安全地传递变量而不是准备好的语句?

MySql select 语句有效但不能删除

sql - 插入 sql 行而不是删除的行会使数据库大小增加或保持不变

sql - Yii 与 sqlite 3

php - Yii - 在数据库中插入空值, 'safe' 属性集

MySQL汇总状态表,用于存储操作结果

sql - Mysqldump 命令出错

regex - 如何在文件中查找恰好出现 35 次字符的行?

c++ - 如何在 C++ 中使用正则表达式匹配 "{"

regex - Bash 提取两个模式之间的字符串