我在GBQ中有一列这样的内容。
[{rank_start: 1, rank_end: 1, prize: {unit_type: 'UNIT_TYPE1', units: 50, unit_currency: 'UNIT_CURRENCY1'}}, {rank_start: 2, rank_end: 50, prize: {unit_type: 'UNIT_TYPE2', units: 20, unit_currency: 'UNIT_CURRENCY2'}}, {rank_start: 51, rank_end: 100, prize: {unit_type: 'UNIT_TYPE3', units: 10, unit_currency: 'UNIT_CURRENCY3'}}, {rank_start: 101, rank_end: 500, prize: {unit_type: 'UNIT_TYPE4', units: 5, unit_currency: 'UNIT_CURRENCY4'}}]
我想为GBQ中的每个排名范围提取诸如 rank_start,rank_end,unit_type,units,unit_currency 之类的值。
如果我们只有一个等级范围,即使用 JSON_EXTRACT()或JSON_EXTRACT_SCALAR(),我知道该怎么做...我会完成的。
但是问题是,我们在JSON中不仅仅具有属性值。
任何人都可以帮助我们如何在GBQ中做到这一点吗?
我尝试了这种粗略的方式,即用逗号分割多次,然后用':'分割,然后用'替换''',然后根据需要在每次分割中获取OFFSET值。
但是这会使代码过于笨拙,无法进行大量的REPLACE和SPLIT操作。
我想看看使用上述JSON函数在GBQ中是否有这样做?
提前谢谢!
答案 0 :(得分:0)
您可以遍历数组,并使用JSON_EXTRACT。根据您希望如何获得结果,是转换的最后一步。这是一个如何做的例子:
-- Recreating your scenario
WITH my_table AS (
SELECT ['{"rank_start": 1, "rank_end": 1, "prize": {"unit_type": "UNIT_TYPE1", "units": 50, "unit_currency": "UNIT_CURRENCY1"}}', '{"rank_start": 2, "rank_end": 50, "prize": {"unit_type": "UNIT_TYPE2", "units": 20, "unit_currency": "UNIT_CURRENCY2"}}', '{"rank_start": 51, "rank_end": 100, "prize": {"unit_type": "UNIT_TYPE3", "units": 10, "unit_currency": "UNIT_CURRENCY3"}}', '{"rank_start": 101, "rank_end": 500, "prize": {"unit_type": "UNIT_TYPE4", "units": 5, "unit_currency": "UNIT_CURRENCY4"}}'] as my_column
)
-- Extracting information
SELECT
(SELECT ARRAY_AGG(CONCAT(
JSON_EXTRACT(myrank, "$['rank_start']"), '-',
JSON_EXTRACT(myrank, "$['rank_end']"), '-',
JSON_EXTRACT(myrank, "$['prize'].unit_type"), '-',
JSON_EXTRACT(myrank, "$['prize'].units"), '-',
JSON_EXTRACT(myrank, "$['prize'].unit_currency")))
FROM UNNEST(my_table.my_column) as myrank ) as fields
FROM
my_table
以下是输出的示例:
Here是BigQuery文档,用于处理数组。