如何从SQL表的DESCRIPTION字段提取NORM标准编号?
需求:从物料描述字段中提取NORM标准编号
我有一张包含约10万条物料记录的表,每条记录都有DESCRIPTION字段,该字段格式无统一标准。
示例数据
| ARTIKELNR | DESCRIPTION |
|---|---|
| 104009400031900 | S235JRG2C+C EN 10277/10 80 x 8 mm Blanker Flachstahl |
| 104009800002950 | Werksattest nach EN 10204 |
| 105009400092360 | EN 10060 Inox Rund Ø 28 mm WNr1.4034 warmgefertigt |
| 105009400068571 | 90 mm WNr1.4404 warmgefertigt, EN 10060, geschmiedet |
| 105009400004420 | WNr1.4301 Inox Vierkantstahl 6 x 6 mm EN 10278, blankgezogen |
| 105009400008800 | WNr1.4301 Inox Band geschnitten 25 x 4 mm, Breitentol. 25 m |
| 105009400068600 | WNr1.4112 Inox Rund 8.00 mm nach EN 10088-3 + A+C+SL, gesch |
| 105009400068700 | WNr1.4301 Inox Rund 36.00 mm nach EN 10088-3, geschliffen, T |
| 105009400068800 | WNr1.4104 Inox Rund 25.00 mm nach EN 10088-3, geschliffen, T |
| 105009400010035 | WNr1.4404 Inox Vierkantstahl 30 x 30 mm, gezogen EN 10278 |
预期结果
| ARTIKELNR | NORM |
|---|---|
| 104009400031900 | EN 10277/10 |
| 104009800002950 | EN 10204 |
| 105009400092360 | EN 10060 |
| 105009400068571 | EN 10060 |
| 105009400004420 | EN 10278 |
| 105009400008800 | |
| 105009400068600 | EN 10088-3 |
| 105009400068700 | EN 10088-3 |
| 105009400068800 | EN 10088-3 |
| 105009400010035 | EN 10278 |
解决方案
可以通过正则表达式匹配提取符合格式的NORM编号,这类编号的规律是:以EN 开头,后面跟随数字,可能包含-或/分隔符。
1. MySQL 实现
使用REGEXP_SUBSTR函数提取匹配内容:
SELECT ARTIKELNR, REGEXP_SUBSTR(DESCRIPTION, 'EN [0-9]+(/|-)[0-9]+|EN [0-9]+') AS NORM FROM your_table_name;
- 正则说明:
EN [0-9]+(/|-)[0-9]+匹配带/或-的EN标准(如EN 10277/10、EN 10088-3);EN [0-9]+匹配纯数字的EN标准(如EN 10204)。
2. PostgreSQL 实现
使用SUBSTRING结合正则:
SELECT ARTIKELNR, SUBSTRING(DESCRIPTION FROM 'EN [0-9]+(/|-)?[0-9]*') AS NORM FROM your_table_name;
- 正则说明:
(/|-)?表示可选的分隔符,[0-9]*表示后面可选的数字,覆盖两种格式的EN标准。
3. 注意事项
- 如果
DESCRIPTION中存在多个EN标准,上述SQL只会提取第一个匹配项;若需提取所有,需根据数据库特性做进一步处理(如递归拆分)。 - 测试正则表达式时,可先针对样本数据验证匹配准确性,再批量应用到10万条数据上。
内容的提问来源于stack exchange,提问作者ouboma
相关产品推荐
相关产品推荐

