【问题标题】:Obtaining string after Last Slash in BigQuery Standard SQL在 BigQuery Standard SQL 中获取 Last Slash 之后的字符串
【发布时间】:2019-04-04 00:43:25
【问题描述】:

假设我有一个名为“Youtube”的列,我想在 URL 的最后一个斜杠之后提取字符串。我将如何在 BigQuery 标准 SQL 中执行此操作?

例子:

https://youtube.com/user/HaraldSchmidtShow

https://youtube.com/user/applesofficial

https://youtube.com/user/GrahamColton

基本上,我想要:

HaraldSchmidtShow

applesofficial

GrahamColton

【问题讨论】:

    标签: sql regex google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT url, 
      (SELECT v FROM UNNEST(SPLIT(url, '/')) v WITH OFFSET o 
        WHERE v != '' ORDER BY o DESC LIMIT 1
      ) last_string
    FROM `data`  
    

    您可以使用虚拟数据作为上面的测试,玩游戏

    #standardSQL
    WITH data AS(
      SELECT 'https://youtube.com/user/HaraldSchmidtShow' AS url UNION ALL
      SELECT 'https://youtube.com/user/applesofficial' UNION ALL
      SELECT 'https://youtube.com/user/GrahamColton/' UNION ALL
      SELECT 'youtube.com/channel/UCEDBbJXgUqRQXCOsluJJ0FQ'
    )
    SELECT url, 
      (SELECT v FROM UNNEST(SPLIT(url, '/')) v WITH OFFSET o 
        WHERE v != '' ORDER BY o DESC LIMIT 1
      ) last_string
    FROM `data`
    

    结果

    Row url                                             last_string  
    1   https://youtube.com/user/HaraldSchmidtShow      HaraldSchmidtShow    
    2   https://youtube.com/user/applesofficial         applesofficial   
    3   https://youtube.com/user/GrahamColton/          GrahamColton     
    4   youtube.com/channel/UCEDBbJXgUqRQXCOsluJJ0FQ    UCEDBbJXgUqRQXCOsluJJ0FQ     
    

    显然,在 Felipe 的回答中使用正则表达式函数 - 更优雅且更易于阅读。
    但在某些情况下,使用上述方法仍然具有实用价值,所以我想把它带到那个帖子中

    【讨论】:

      【解决方案2】:

      上一个答案的替代方案,当末尾有“/”时也可以使用:

      WITH data AS(
        SELECT 'https://youtube.com/user/HaraldSchmidtShow' AS url UNION ALL
        SELECT 'https://youtube.com/user/applesofficial' UNION ALL
        SELECT 'https://youtube.com/user/GrahamColton' UNION ALL
        SELECT 'https://youtube.com/user/GrahamColton/'
      )
      
      SELECT REGEXP_EXTRACT(url, r'/([^/]+)/?$') name
      FROM `data`
      

      【讨论】:

      • 打败我Felipe(也更好的正则表达式来处理斜杠;-))
      【解决方案3】:

      这可能已经为您解决问题了:

      WITH data AS(
        SELECT 'https://youtube.com/user/HaraldSchmidtShow' AS url UNION ALL
        SELECT 'https://youtube.com/user/applesofficial' UNION ALL
        SELECT 'https://youtube.com/user/GrahamColton'
      )
      
      SELECT
        SPLIT(url, '/')[SAFE_OFFSET(ARRAY_LENGTH(SPLIT(url, '/')) - 1)] AS name
      FROM `data`
      

      它只是拆分字符串并获取最后一个值。

      【讨论】:

      • 我尝试使用您的解决方案,我是否尝试使用您的解决方案并执行了以下操作,但它只是给了我一个空白列:SELECT SPLIT(youtube, '/')[SAFE_OFFSET(ARRAY_LENGTH(SPLIT(youtube , '/')) - 1)] ASedited_youtube FROM data
      • 查询在技术上有效,但输出是空白列
      • 当我将您的子查询与 UNION alls 一起使用时,它可以工作,但是当我将它用于我的实际数据时,输出为空白。 'youtube' 是我数据中的一个字符串列,因此正则表达式应该可以工作。 '我很困惑为什么它不起作用。有什么想法吗?
      • 嗯不确定。您也可以带上“youtube”值来检查它。也许不是所有的 url 都遵循模式 /user/name
      • 是的,这是真的。 “youtube”列中还有其他类型的 URL,例如:youtube.com/channel/UCEDBbJXgUqRQXCOsluJJ0FQ
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多