我在大查询中有一些博客数据,我需要进行转换以便于使用和查询。数据如下:
我想在结果{... ..} (蓝色)后提取并转换卷曲括号内的数据。数据的格式为'(\ d +((PQ)|(KL))+ \ d +)',结果数组中可以有1-20个条目。我只对前16个条目感兴趣。
我已经能够使用Substr和regext_extract将卷曲括号内的数据提取到新列中。但我无法将其拆分为列(有时只有1个结果,所以分隔符“,”缺失。我是新的正则表达式,可能是我可以使用像'(\ d +((PQ)| (KL))+ \ d +) {1}'等将数据拆分成多列然后转动它。
在我的情况下,理想的输出是将它转换成类似的东西:
在上面的解决方案中,原始表中的每一行重复1-16次,具体取决于Results数组中的项目数。
我不确定是否可以在大查询中执行此操作。如果有人能在这里帮助我,我将不胜感激。
如果无法做到这一点,那么对于结果数组中少于16个条目的情况,我可以在Event_details中为每个具有NULL值的事件设置16行。
如果这两个都不可能,最后一个解决方案是将其转换为:
我想要转换数据的原因是,在大多数情况下,我需要找到哪些结果数组项目出现以及按什么顺序出现。
答案 0 :(得分:2)
检查出来:Split string into multiple columns with bigquery。 在他们的情况下,它由空格分隔。用','
替换\ s类似的东西:
SELECT
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){0}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word0,
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){1}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word1,
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){2}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word2,
Regexp_extract(StringToParse,r'^*{(?:[^,]*,){3}(\d+(?:(?:PQ)|(?:KL))+\d+)\s?') as Word3,
FROM
(SELECT 'bla{1234PQ5,6789KL0,1234PQ5,6789KL0,123' as StringToParse)
答案 1 :(得分:1)
使用SPLIT()
SELECT Event_ID, Event_UserID, Event_SessionID, Keyword,
SPLIT(REGEXP_EXTRACT(Event_details,"Results\{(.*)\}"),",") as Event_details_item
FROM mydata.mytable