Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在BigQuery标准SQL中获取最后一个斜杠后的字符串_Sql_Regex_Google Bigquery - Fatal编程技术网

在BigQuery标准SQL中获取最后一个斜杠后的字符串

在BigQuery标准SQL中获取最后一个斜杠后的字符串,sql,regex,google-bigquery,Sql,Regex,Google Bigquery,假设我有一个名为“Youtube”的专栏,我想提取URL最后一个斜杠后的字符串。在BigQuery标准SQL中如何实现这一点 示例: https://youtube.com/user/HaraldSchmidtShow https://youtube.com/user/applesofficial https://youtube.com/user/GrahamColton 基本上,我想要: HaraldSchmidtShow applesofficial GrahamColton 这

假设我有一个名为“Youtube”的专栏,我想提取URL最后一个斜杠后的字符串。在BigQuery标准SQL中如何实现这一点

示例:

https://youtube.com/user/HaraldSchmidtShow

https://youtube.com/user/applesofficial

https://youtube.com/user/GrahamColton
基本上,我想要:

HaraldSchmidtShow

applesofficial

GrahamColton

这可能已经帮到你了:

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`

它只是拆分字符串,然后取最后一个值。

上一个答案的替代答案,当结尾有一个“/”时也适用:

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`

下面是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的答案中使用正则表达式函数更优雅、更容易阅读。

但在某些情况下,使用上述方法仍然具有实用价值,因此我想将其带到那篇文章中

我尝试了使用您的解决方案,我尝试了使用您的解决方案,并执行了以下操作,但它只给了我一个空白列:选择拆分(youtube,“/”)[SAFE_OFFSET(ARRAY_LENGTH)(拆分(youtube,“/”)-1]从
data
编辑时,从技术上来说,查询是有效的,但输出是空白列。当我将子查询与UNION ALL一起使用时,查询是有效的,但当我将其用于实际数据时,输出是空白的youtube“在我的数据中是一个字符串列,因此正则表达式应该可以工作。”我不明白为什么它不起作用。有什么想法吗?嗯,不确定。你也可以带上“youtube”的值来查看它。也许并非所有的url都遵循/user/name模式是的,这是真的。“youtube”栏中还有其他类型的URL,例如:Beat me to it Felipe(处理尾随斜杠的正则表达式也更好;-))