在 Google BigQuery 中将数组转换为字符串

问题描述

我有一个类似的查询

SELECT lineid,array
   (
          select day_name positions
          FROM   unnest(regexp_extract_all(json_extract(json,'$.attributes.day-part-targeting.data.dayparts'),r'("+[A-Za-z]+"+:+"+[A-Za-z]+")')) pair,unnest([STRUCT(CONCAT(REPLACE(SPLIT(pair,':')[OFFSET(1)],'"',''),';') AS day_name)]) )day_part,array
   (
          SELECT start_time positions
          FROM   unnest(regexp_extract_all(json_extract(json,r'"[^"]+":\[[\d,]*?]')) pair,unnest([STRUCT(CONCAT(REPLACE(SPLIT(SPLIT(pair,',')[OFFSET(0)],'[',':00;')AS start_time    )])) hour_part,array(
          SELECT end_time VALUES    
         FROM unnest(regexp_extract_all(json_extract(json,unnest([STRUCT(CONCAT(REPLACE(REVERSE(SPLIT(REVERSE(SPLIT(pair,':')[OFFSET(1)]),')[OFFSET(0)]),']',':00;')AS end_time
)])
) time_part
FROM `project.dataset.table`

这给出了以下结果

enter image description here

我想要一个类似的输出

enter image description here

解决方法

我能够在 where 子句中使用偏移量来解决这个问题

SELECT lineid,day_part
FROM   (
            SELECT lineid,array_to_string( array
                    (
                            select day_name
                            FROM   unnest(regexp_extract_all(json_extract(json,'$.attributes.day-part-targeting.data.dayparts'),r'("+[A-Za-z]+"+:+"+[A-Za-z]+")')) day WITH offset pos1,unnest(regexp_extract_all(json_extract(json,r'"[^"]+":\[[\d,]*?]')) hour WITH offset pos2,unnest([STRUCT(CONCAT(REPLACE(SPLIT(day,':')[OFFSET(1)],'"',''),';')|| format_time('%I:%M %p',parse_time('%H:%M',concat(replace(split(split(hour,',')[OFFSET(0)],'[',':00')))             || ';' || format_time('%I:%M %p',concat(replace(reverse(split(reverse(split(hour,':')[OFFSET(1)]),')[OFFSET(0)]),']',':00'))) AS day_name )])
                            WHERE  pos1 = pos2),'|')day_part
            FROM   table )