【发布时间】:2021-10-14 02:33:50
【问题描述】:
我在雪花中有一个输入表,其中列包含数据模式如下
城市、州/位置/指定
城市状态/位置/指定
城市、州/位置
想仅提取位置并存储在另一列中,您能帮我这样做吗?
【问题讨论】:
标签: snowflake-cloud-data-platform regexp-substr sql-query-store
我在雪花中有一个输入表,其中列包含数据模式如下
城市、州/位置/指定
城市状态/位置/指定
城市、州/位置
想仅提取位置并存储在另一列中,您能帮我这样做吗?
【问题讨论】:
标签: snowflake-cloud-data-platform regexp-substr sql-query-store
您可以使用 SPLIT_PART,如上一个答案中所述,但如果您想使用正则表达式,我会使用 REGEXP_SUBSTR,如下所示:
REGEXP_SUBSTR(YOUR_FIELD_HERE,'/([^/]+)',1,1,'e')
简单地说,它正在寻找一个斜杠,然后获取它后面的所有非斜杠字符,这意味着它在下一个斜杠之前结束,或者在字符串的末尾。
1,1,'e' 对应于:从字符串的第一个字符开始,返回第一个匹配项,并提取子字符串(括号中的所有内容)。
Snowflake 文档是 here。
【讨论】:
有几种方法可以做到这一点:
A) 使用 SPLIT_PART 函数:
SELECT SPLIT_PART('city, state/LOCATION/designation', '/', 2);
参考:SPLIT_PART
B) 使用 SPLIT_TO_TABLE 表格函数:
SELECT t.VALUE
FROM TABLE(SPLIT_TO_TABLE('city, state/LOCATION/designation', '/')) AS t
WHERE t.INDEX = 2;
C) 使用 REGEXP 表达式:
SELECT REGEXP_REPLACE('city, state/LOCATION/designation', '(.*)/(.*)/(.*)', '\\2');
但是如果你没有第三个术语('designation'),这个不起作用,你需要结合两个调用并检查反斜杠的数量。
SELECT IFF(REGEXP_COUNT('city, state/LOCATION', '/') = 1,
REGEXP_REPLACE('city, state/LOCATION','(.*)/(.*)','\\2'),
REGEXP_REPLACE('city, state/LOCATION','(.*)/(.*)/(.*)','\\2'));
【讨论】: