Arrays Bigquery-将数组转换为列
以下查询返回键/值对的列表:Arrays Bigquery-将数组转换为列,arrays,google-bigquery,transpose,Arrays,Google Bigquery,Transpose,以下查询返回键/值对的列表: SELECT ["name:apple", "color:red"] as fruit; 结果: 是否有一种方法可以将数据转换为: 更新 我正在寻找一个通用的解决方案,其中键和值以及结果的数组长度未知,即:SELECT[“key0:val0”,“key1:val1”…]作为数据不确定是否有更简洁的方法可以做到这一点,但这是可行的 WITH CTE AS ( SELECT ["name:apple", "color:red"] as fruit UNION AL
SELECT ["name:apple", "color:red"] as fruit;
结果:是否有一种方法可以将数据转换为:
更新
我正在寻找一个通用的解决方案,其中键和值以及结果的数组长度未知,即:
SELECT[“key0:val0”,“key1:val1”…]作为数据代码>不确定是否有更简洁的方法可以做到这一点,但这是可行的
WITH CTE AS (
SELECT ["name:apple", "color:red"] as fruit
UNION ALL
SELECT ["name:pear", "color:green"]
),
CTE2 AS (
SELECT row_number() over () as rowNumber, fruit
FROM CTE
)
SELECT max(if(REGEXP_CONTAINS(fruit,'name:'),replace(fruit,'name:',''),null)) name,
max(if(REGEXP_CONTAINS(fruit,'color:'),replace(fruit,'color:',''),null)) color
FROM CTE2,
UNNEST(fruit) as fruit
GROUP BY rowNumber
我猜BigQuery的方法是在数组上使用子选择:
WITH t AS (SELECT * FROM UNNEST([
struct(['name:apple','color:red'] AS fruit),
struct(['name:pear','color:purple'] AS fruit)
]) )
SELECT
(SELECT SPLIT(f, ':')[SAFE_OFFSET(1)] FROM t.fruit f WHERE SPLIT(f, ':')[SAFE_OFFSET(0)]='name') AS name,
(SELECT SPLIT(f, ':')[SAFE_OFFSET(1)] FROM t.fruit f WHERE SPLIT(f, ':')[SAFE_OFFSET(0)]='color') AS color
FROM t
这应该是一种快速实现结果的方法:
#standardSQL
with items as (
select ["name:apple", "color:red"] p union all
select ["name:orange", "color:orange"] UNION ALL
select ["name:grapes", "color:green"]
),
arrayed as (
select
array_agg(
struct(
if(split(p, ":")[offset(0)] = 'name', split(p, ":")[offset(1)], '') as name,
if(split(p, ":")[offset(0)] = 'color', split(p, ":")[offset(1)], '') as color
)
) item from items, unnest(p) p
)
select
array((select i.name from unnest(item) i where i.name != '')) as name,
array((select i.color from unnest(item) i where i.color != '')) as color
from arrayed
由于这些数据结构的性质,这是不可能的:数组具有动态数量的元素,而结构或表具有键的元素,这些键的模式需要在多行上保持一致。您需要编写一个查询来编写查询。。。请看这里@MikhailBerlyant的答案