【问题标题】:Create new column with everything is between third - and forth - of another column创建新列,所有内容都在另一列的第三和第四之间
【发布时间】:2020-10-31 20:27:15
【问题描述】:

我需要基于列col 创建一个新列,但提取第三个- 和第四个- 之间的所有内容。示例:
ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC
111-AAAAA-bb-INEEDTHIS-BB-435-A

如何使用 Big Query 做到这一点?
我正在尝试这样的事情:

SELECT REGEXP_EXTRACT(col, r'\w\w[^\d]\d\d') as newcol from mytable

如果可能的话,我也想了解这个解决方案背后的regex

【问题讨论】:

    标签: sql regex google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    最简单的方法是使用 SPLIT 函数,如下例所示

    SELECT SPLIT(col, '-')[SAFE_OFFSET(3)] AS newcol   
    

    如果出于某种原因您想使用正则表达式 - 您可以使用 REGEXP_EXTRACT,如下例所示

    REGEXP_EXTRACT(col, r'(?:[^-]*-){3}([^-]+)') AS newcol   
    

    您可以使用来自您问题的示例数据来测试和使用上述两种方法,如下例所示

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT 'ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC' col UNION ALL
      SELECT '111-AAAAA-bb-INEEDTHIS-BB-435-A'
    )
    SELECT 
      col, 
      SPLIT(col, '-')[SAFE_OFFSET(3)] AS newcol_with_split,
      REGEXP_EXTRACT(col, r'(?:[^-]*-){3}([^-]+)') AS newcol_with_regexp
    FROM `project.dataset.table`   
    

    有输出

    Row col                                     newcol_with_split   newcol_with_regexp   
    1   ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC  INEEDTHIS           INEEDTHIS    
    2   111-AAAAA-bb-INEEDTHIS-BB-435-A         INEEDTHIS           INEEDTHIS      
    

    正则表达式的简要说明

    1. [^-]*- 捕获 ABC-123-、aaa- 等条目。
    2. (?:[^-]*-) 确保不会提取这些条目
    3. (?:[^-]*-){3} 确保将跳过前三个此类条目
    4. 最后,([^-]+) 提取目标片段直到下一个-

    【讨论】:

    • 是的,你成功了!谢谢!你知道哪一个在大数据上的表现更好吗?
    猜你喜欢
    • 2013-01-26
    • 2022-01-06
    • 2017-07-22
    • 2018-06-10
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2012-12-03
    相关资源
    最近更新 更多