【问题标题】:How to take substring before "," or "-" or " "?如何在“,”或“-”或“”之前取子字符串?
【发布时间】:2020-01-05 03:52:49
【问题描述】:

我在 Presto 中有两个可以与 "po_num" 连接的数据集。

第一个数据集有一个干净的"po_num",它是7 位或10 位数字。 (例如 1234567)

然而,第二个数据集中的 Po_num 有额外的字符串,要么以 "," or "-" or " ". (e.g. 1234567-1 or 1234567,1 or 1234567 -1) 开头

我想我需要一个函数来

1) 检测第二个 po_num 中第一个非数字字符串的位置和

2) 在位置之前取一个子字符串。或者任何其他方式来处理这个......

有什么建议吗?

【问题讨论】:

    标签: sql string substring presto strpos


    【解决方案1】:

    你可以使用regexp_extract:

    with your_data as(
    select * from (values
    '1234567-1','1234567,1','1234567 -1'
    )s (po_num)
    )
    
    select regexp_extract(po_num,'^(\d*)',1) as po_num  from your_data s
    

    结果:

    po_num
    
    1234567
    1234567
    1234567
    

    同样使用regexp_split:

    select regexp_split(po_num,'[^\d]+')[1] as po_num from your_data s 
    

    【讨论】:

      【解决方案2】:

      假设您希望匹配的 7 位或 10 位数字始终连续出现,没有任何其他中间字符,那么您可以尝试在此处使用 REGEXP_LIKE

      SELECT *
      FROM table1 t1
      INNER JOIN table2 t2
          ON REGEXP_LIKE(t2.Po_num, '\b' || t1.po_num || '\b');
      

      【讨论】:

        【解决方案3】:

        为什么不只取每个数字的前 7 个数字(并确保它们属于同一类型 - 使用 CAST (x AS int))并加入。

        【讨论】:

        • 数字可以是7位或10位。
        猜你喜欢
        • 2012-02-26
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 2010-12-28
        • 2021-12-01
        • 2019-06-16
        • 2020-02-29
        • 1970-01-01
        相关资源
        最近更新 更多