【问题标题】:How to parse string from one column into delimited values in SQL如何将一列中的字符串解析为 SQL 中的分隔值
【发布时间】:2022-01-21 18:55:25
【问题描述】:

这是我在 Redshift 中的专栏

SHIPMENT_ID
-----------------------------------------
FBA15KS66741, FBA15KS6673D
FBA15NHV7PXX (Oct 20th)
FBA15XNW0SWY 27 balance 2 of 2
FBA15M575MDL &  FBA15M59W1Y5
FBA15NHV7PXX (Oct 20th)
FBA15D7WPZVR /FBA15D7WWTPK/FBA15D7WW1GL

我想做

SHIPMENT_ID
-----------------------------------------
FBA15KS66741, FBA15KS6673D
FBA15NHV7PXX
FBA15XNW0SWY
FBA15M575MDL, FBA15M59W1Y5
FBA15NHV7PXX
FBA15D7WPZVR, FBA15D7WWTPK, FBA15D7WW1GL

仅在 SQL 中,处理此问题的最佳方法是什么?

【问题讨论】:

    标签: sql string parsing amazon-redshift


    【解决方案1】:

    这适用于 PostgreSQL,因此可能适用于 Redshift,具体取决于 PG8 中的功能可用性。

    WITH items AS
    (
      SELECT shipment_id,
             ARRAY_TO_STRING(REGEXP_MATCHES(shipment_id,'FBA15[0-9a-zA-z]{7}','g'),'') AS unique_shipment_ids
      FROM dat
    )
    SELECT shipment_id,
           STRING_AGG(unique_shipment_ids,',') AS shipment_id_csv
    FROM items
    GROUP BY shipment_id;
    

    我假设:

    • 每件商品都以字符“FBA15”开头
    • 前 5 个字符后正好有 7 个字符

    如果我的假设不正确,您可以编辑正则表达式模式。

    方法是:

    1. 使用REGEXP_MATCHES 捕获每行中的每个项目。这会在 shipping_id 中为每个唯一值创建多行
    2. 使用ARRAY_TO_STRING 将这些值转换为text,而不是text[]
    3. 使用STRING_AGG 用逗号分隔符将它们重新连接在一起

    我发现我无法在REGEXP_MATCHES 周围直接使用STRING_AGG,因为我收到错误aggregate function calls cannot contain set-returning function calls,因此选择了CTE。我认为子查询也可以。

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多