Snowflake SQL:如何从Body字段提取M/W生成独立Gender列
回答
SPLIT函数在这个场景下确实不是最优选择:它会把整个字符串按空格拆成数组,既带来不必要的内存开销,还会因为产品名包含不确定数量的空格(比如Tiger White Stone是多词产品名),没法固定取下标值,很容易取错。
直接用正则匹配抓目标值就行,性能比split高很多,也不受前后字段空格数影响。你的场景里性别标识永远是前后带空格的独立M/W,不会和产品名、内部名里的字符混淆,匹配逻辑非常简单:
SELECT Body, REGEXP_SUBSTR(Body, ' ([MW]) ', 1, 1, 'e', 1) AS Gender FROM xyz;
这个语句的逻辑是扫描字符串,找到第一个前后带空格的M或W,直接返回M/W本身,不带前后空格。不管产品名有多少个词、内部命名多长,都能精准抓到性别值。如果后续有小写m/w的脏数据,把匹配参数改成'ie'就能开启不区分大小写匹配。
针对你给的样例数据,返回结果完全符合预期:
| Body | Gender |
|---|---|
| Beta M yy-Tz | M |
| Beta M zz-Ox | M |
| Beta W yy-Tz | W |
| Tiger W Dash | W |
| Tiger M Dash | M |
| Tiger White Stone W Pearl | W |
| Tiger White Stone M Pearl | M |
如果你能100%确定第三部分的内部命名永远不带空格,也可以用反向取位的写法,性能和正则接近:
SELECT Body, SPLIT_PART(Body, ' ', ARRAY_SIZE(SPLIT_TO_ARRAY(Body, ' ')) - 1) AS Gender FROM xyz;
但这个写法容错性差,只要后续内部命名出现带空格的内容就会取错值,优先用正则方案。
内容的提问来源于stack exchange,提问作者Kushal
相关产品推荐
相关产品推荐

