在 Snowflake 中使用 REGEXP_SUBSTR 在符号周围拉出多个项目,包括“(”
Posted
技术标签:
【中文标题】在 Snowflake 中使用 REGEXP_SUBSTR 在符号周围拉出多个项目,包括“(”【英文标题】:Using REGEXP_SUBSTR in Snowflake to pull multiple items around symbols including "(" 【发布时间】:2020-11-13 22:07:46 【问题描述】:我有一个长字符串的语法
'item_name (price + tax), item_name (price + tax), item_name (price +tax)'
我想进入以下行:item_1、price_1、item_2、price_2 等。
我使用以下方法获取 item_1 和 item_2 但我似乎无法提取价格,因为我收到 REGEXP_SUBSTR(items,'([^-]+',1,1) 错误,因为“(”。我做错了什么?
,REGEXP_SUBSTR(items,'[^-]+',1,1) 作为 item_1 ,子串( REGEXP_SUBSTR(items,',[^-]+',1,1) ,2 ,LEN(REGEXP_SUBSTR(items,',[^-]+',1,1))-2 ) 作为 item_2
【问题讨论】:
【参考方案1】:使用split_to_table()
,然后进行一些附加字符串操作:
select split_part(t.value, ' ', 1) as item_name,
regexp_substr(items, '[(]([^ +]+)', 1, 1, 'e') as price
from t cross join lateral
table( split_to_table(t.items, ',') ) as t;
【讨论】:
不幸的是,这不起作用,因为我有一些名称中带有“(”的项目(即类似“(2lbs)”)。我上面的解决方案似乎是正确的。【参考方案2】:[编辑]我添加了替换功能,这次能够正确获取所有数字
替换( 子串( REGEXP_SUBSTR(items,'[^+]+',1,1) ,-6 ,5 ),'(') 作为价格_1
我实际上可以通过使用以下语法来解决大部分问题。每当一行只有一个项目(即 item_1,price_1)而仅此而已,其他列仅显示空白。不过,对于“18.99”与“9.99”之类的数字,我仍然需要弄清楚如何正确拉动它们。
,REGEXP_SUBSTR(items,'[^-]+',1,1) 作为 item_1 ,子串( REGEXP_SUBSTR(items,'[^+]+',1,1) ,-5 ,5 ) 作为价格_1
,SUBSTRING(
REGEXP_SUBSTR(items,',[^-]+',1,1)
,2
,LEN(REGEXP_SUBSTR(items,',[^-]+',1,1))-2
) as item_2
,SUBSTRING(
REGEXP_SUBSTR(items,'[^+]+',1,2)
,-5
,5
) as price_2
,SUBSTRING(
REGEXP_SUBSTR(items,',[^-]+',1,2)
,2
,LEN(REGEXP_SUBSTR(items,',[^-]+',1,2))-2
) as item_3
,SUBSTRING(
REGEXP_SUBSTR(items,'[^+]+',1,3)
,-5
,5
) as price_3
【讨论】:
以上是关于在 Snowflake 中使用 REGEXP_SUBSTR 在符号周围拉出多个项目,包括“(”的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Snowflake 中使用混合数据类型的字段内连接两个简单的 CTE