问题描述
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`
这给出了以下结果
解决方法
我能够在 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 )