如何在Snowflake SQL中从商品描述字符串提取特定规格数字
问题
需要从格式各异的商品描述中提取正确的包装规格数字(统一为GM单位),原SQL语句REGEXP_REPLACE(SPLIT_PART(UPPER(PRODUTC_DESCRIPTION),'GM',1),'[^[:digit:]]')会提取所有数字导致结果错误,例如将"PRODUCT A 3 CHEESE SLICE 170 GM"中的3和170合并为3170,且无法处理KG单位的转换。
解决方案
通过正则精准匹配紧跟GM/KG单位的数值,再根据单位转换为GM,Snowflake SQL实现如下:
SELECT PRODUCT_DESCRIPTION, CASE -- 匹配KG单位,提取数值后乘以1000转GM WHEN REGEXP_LIKE(UPPER(PRODUCT_DESCRIPTION), '[0-9.]+KG') THEN TO_NUMBER(REGEXP_SUBSTR(UPPER(PRODUCT_DESCRIPTION), '[0-9.]+(?=KG)')) * 1000 -- 匹配GM单位,直接提取数值 WHEN REGEXP_LIKE(UPPER(PRODUCT_DESCRIPTION), '[0-9.]+GM') THEN TO_NUMBER(REGEXP_SUBSTR(UPPER(PRODUCT_DESCRIPTION), '[0-9.]+(?=GM)')) ELSE NULL -- 无匹配时返回NULL,可根据需求调整 END AS EXPECTED_PACK_SIZE FROM YOUR_TABLE;
逻辑说明
- 使用正向预查正则
[0-9.]+(?=GM)和[0-9.]+(?=KG),精准提取GM/KG前的数值(包括小数),不会匹配前面无关的数字(如"12X156GM"中的12会被忽略,只提取156)。 - 对KG单位的数值自动乘以1000,统一转换为GM单位的规格数字。
- 支持带小数点的数值处理(如1.3KG转换为1300)。
测试结果
针对示例数据执行后,结果完全符合预期:
| PRODUCT_DESCRIPTION | EXPECTED_PACK_SIZE |
|---|---|
| PRODUCT A 3 CHEESE SLICE 170 GM | 170 |
| PRODUCT B SUGAR 1.3KG (CL) | 1300 |
| PRODUCT C CHEESE SLICES 12X156GM | 156 |
| PRODUCT KETCHUP BOTTLE 200GM (CL) | 200 |
| PRODUCT KETCHUP 1.3KG (CL) | 1300 |
| KITCHEN 88 KALE & CHIA BASMATI RICE 150GM | 150 |
内容的提问来源于stack exchange,提问作者Vipendra Singh
相关产品推荐
相关产品推荐

