【问题标题】:Extracting text from a string before the first occurrence of a symbol在第一次出现符号之前从字符串中提取文本
【发布时间】:2020-04-20 19:50:37
【问题描述】:

我的数据如下所示-

type       A_URL                          B_URL             C_URL
A         123.com/123abc?....     123.com/123abc?....       123.com/123abc?....
B         pqr.com/435678?....     pqr.com/435678?....       pqr.com/435678?....
C         lmn.com/12u356?....     lmn.com/12u356?....       lmn.com/12u356?....

我想创建一个新的列 URL 并执行以下操作-

if type is A 提取 first '?' 之前的所有内容在 A_URL 列中并将其存储到新列 url,

如果类型是 B,则提取 first '?' 之前的所有内容在 B_URL 列中并将其存储到新列 url,

如果类型是 C,则提取 first '?' 之前的所有内容在 C_URL 列中并将其存储到新列 url

结果应该如下所示-

type       A_URL                          B_URL             C_URL                     url
A         123.com/123abc?....     123.com/123abc?....       123.com/123abc?....     123.com/123abc?
B         pqr.com/435678?....     pqr.com/435678?....       pqr.com/435678?....     pqr.com/435678?
C         lmn.com/12u356?....     lmn.com/12u356?....       lmn.com/12u356?....     lmn.com/12u356?

注意:虽然上面的 A_URL、B_URL 和 C_URL 看起来一样,但在第一个“?”之后的信息不同。存储在其中。

【问题讨论】:

    标签: sql regex google-bigquery substring text-extraction


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT * EXCEPT(url),
      REGEXP_EXTRACT(url, r'^[^?]+\?') AS url
    FROM `project.dataset.table`,
    UNNEST([CASE type 
      WHEN 'A' THEN A_URL 
      WHEN 'B' THEN B_URL 
      WHEN 'C' THEN C_URL 
    END]) url
    

    【讨论】:

      【解决方案2】:

      你可以使用regexp_extract():

      select t.*,
             regexp_extract(case when type = 'A' then a_url
                                 when type = 'B' then b_url
                                 when type = 'C' then c_url
                            end,
                            '^[^?]+'
      
      from t;
      

      编辑:

      如果你想保留最后的?,那么使用:

      select t.*,
             regexp_extract(case when type = 'A' then a_url
                                 when type = 'B' then b_url
                                 when type = 'C' then c_url
                            end,
                            '^[^?]+[?]'
      
      from t;
      

      【讨论】:

      • @Gordon_Linoff 谢谢!如果我想包含“?”怎么办?以及在最终的 url 列中?
      • 你会使用'^[^?]+[?]'
      猜你喜欢
      • 2014-11-28
      • 2011-11-02
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多