Sql 如何取消设置JSON字段,使它们保持在相同的记录上?

Sql 如何取消设置JSON字段,使它们保持在相同的记录上?,sql,arrays,json,pivot,amazon-athena,Sql,Arrays,Json,Pivot,Amazon Athena,假设我提取了一个json字段作为数组,如下所示 {{priceCurrency=Euro,price=16.99,validInRegion=Netherlands}, {priceCurrency=Euro,price=16.99,validInRegion=Spain}, {priceCurrency=Pound Sterling,price=15.0,validInRegion=Great Britain}} 如何根据它的某些值(货币、地区等)取消对它的测试,而不将它拆分为不同的记录 使

假设我提取了一个json字段作为数组,如下所示

{{priceCurrency=Euro,price=16.99,validInRegion=Netherlands},
{priceCurrency=Euro,price=16.99,validInRegion=Spain},
{priceCurrency=Pound Sterling,price=15.0,validInRegion=Great Britain}}
如何根据它的某些值(货币、地区等)取消对它的测试,而不将它拆分为不同的记录

使用
交叉连接UNNEST
我实现了以下目标:

> Product   |  priceCurrency   |  price   |    priceRegion
> -----------------------------------------------------------
> 1         |      Euro        |  16.99   |  Netherlands              
> 1         |      Euro        |  16.99   |  Spain     
> 1         |      Pound       |  15.0    |  Great Britain 
> 2         |      ...         |   ...    |       ...      
> 2         |      ...         |   ...    |       ...      
虽然我想做到这一点:

> Product   |  currencyNL   |  priceNL   |    currencyGB   |  priceGB  |  currencyES  |  priceES
> -------------------------------------------------------------------------------------------------
> 1         |    Euro       |  16.99     |       Pound     |   15.0    |    Euro      |  16.99  
> 2         |    ...        |   ...      |        ...      |    ...    |     ...      |   ...   

如果您有预定义的货币列表(和有效的JSON数组),则可以
unest
,然后使用条件聚合:

select 
    t.product,
    max(case when x.obj.validInRegion = 'Netherlands' then x.obj.priceCurrency) currencyNL,
    max(case when x.obj.validInRegion = 'Netherlands' then x.obj.price) priceNL,
    max(case when x.obj.validInRegion = 'Great Britain' then x.obj.priceCurrency) currencyGB,
    max(case when x.obj.validInRegion = 'Great Britain' then x.obj.price) priceGB,
    ...
from mytable t
cross join unnest(t.js_column) as x(obj)
group by t.product

除了像GMB在答案中建议的那样显式列出所有行之外,没有办法从行生成列(另请参见)。但是,您可以聚合为如下所示的贴图 回答:–使用这种方法,您可以得到如下结果:

Product | Prices
--------+------------------------------------------------------------------------
1       | {Netherlands_Euro=>16.99, Spain_Euro=>16.99, Great Britain_Pound=>15.0}
2       | {…}
可能还可以进行多级聚合,并获得如下结果:

Product | Prices
--------+----------------------------------------------------------------------------------
1       | {Netherlands=>{Euro=>16.99}, Spain=>{Euro=>16.99}, {Great Britain=>{Pound=>15.0}}
2       | {…}

具体如何做到这一点取决于您的查询。在

中有更多详细信息,您需要首先确保您的JSON有效:问题:您是否将国家代码存储在某处?谢谢您的评论。关于JSON的有效性,您是对的。将其视为对原始JSON的简化提取。关于你的第二条评论,让我们假设我可以把它们存储在某个地方,因为这些代码是预定义的。