从sql查询中的列中获取多次出现的字符串

从sql查询中的列中获取多次出现的字符串,sql,google-bigquery,Sql,Google Bigquery,我有一个表,其中包含以下数据 Ticketid created Details 205853669 2020-03-05 #CLOSE# Next action value://346004/ next action value://346002/ or value://346008/ 205853670 2020-03-06 #Archive Next action value://346088/ next action value://346077/ or

我有一个表,其中包含以下数据

Ticketid    created     Details
205853669   2020-03-05  #CLOSE# Next action  value://346004/ next action  value://346002/ or value://346008/
205853670   2020-03-06  #Archive Next action  value://346088/ next action  value://346077/ or value://346057/
字符串“value://”模式在所有列中都是相同的,我想从字符串中提取这些数字

ticketid    Numbers
205853669   346004
205853669   346002
205853669   346008
205853670   346088
205853670   346077
205853670   346057
我只使用标准Sql 我已经创建了如下内容

select ticketid,TRIM(REPLACE(SUBSTR(
    details, STRPOS(details, "value//"),10
  ),"value//"","")) AS number from table

下面的查询将起作用。此查询拆分对值的注释,然后提取6位id

with `project.dataset.table` as (
select id, split(details, 'value://') AS number from (
   select '1' as id, '#CLOSE# Next action  value://346004/ next action  value://346002/ or value://346008/' as details
   union all
   select '2' as id, '#Archive Next action  value://346088/ next action  value://346077/ or value://346057/'
  )
)
select id, regexp_extract(number1, "\\d{6}") as number
from `project.dataset.table` ,
UNNEST( number ) number1
where regexp_extract(number1, "\\d{6}") is not null
它有一个关于
unest
函数的注释。根据文件

UNNEST操作符获取一个数组并返回一个表,其中数组中的每个元素对应一行


如果每个注释只有几个“值://”,那么这不会造成太多问题,但如果“值://”的数量不受限制,这可能会成为性能瓶颈,因此请记住这一点。另一方面,这是我知道如何使用CloudSQL实现这一点的唯一方法。

下面是针对BigQuery标准SQL的

#standardSQL
SELECT Ticketid, Numbers
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(Details, r'value://(\d+)/')) Numbers   
如果要应用于问题中的样本数据,则输出为

Row Ticketid    Numbers  
1   205853669   346004   
2   205853669   346002   
3   205853669   346008   
4   205853670   346088   
5   205853670   346077   
6   205853670   346057   

请您解释一下“r’value://(\d+/)”)这部分。它提取
value://
/
之间的数字。例如,它从
value://346004/
Ok。谢谢,但是如果partten/文本类似于“value://346004 下一步行动”。我的意思是数字后面没有“/”。请使用
r'value://(\d+)”
并告诉我它是否适合您