在 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 是不是支持索引?

在 Snowflake 中灵活命名表

在 Snowflake 中使用 SQL 进行漏斗分析

无法在 Snowflake 中使用混合数据类型的字段内连接两个简单的 CTE

我们如何在 Snowflake 中使用子查询,从 (select....) 中选择列失败

在 Snowflake 中使用 Count Distinct 和 Pivot