如何在 Snowflake 中展平 json 字符串列表

How to flatten out a json list of strings in Snowflake

您好,我在 Snowflake 中处理 table 中的一些关系数据,其中还包括具有 VARIANT 数据类型格式的 JSON 列。我能够操作 JSON 数据并获取我想要的大部分列,但我在处理 1 数据列表(或数组?)时遇到了问题。

下面是 VARIANT 列的原始 JSON 格式。此专栏名为 product_attributes,我遇到问题的关键是 web_categories

{
  "data": {
    "availability": "available",
    "product_company": "macys",
    "id": "22345897290",
    "price": 5.99,
    "web_categories": [
      [
        "Beauty",
        "Makeup",
        "Eye Makeup",
        "Brows"
      ]
    ]
  }
}

我基本上想按 id 属性分组,然后 return 每个产品的网络类别数量的不同计数。在这种情况下,我希望 return 4.

select product_attributes:data:id::string as id, count(distinct(t1.value)) as number_of_categories
from mytable, table(flatten(product_attributes:data:web_categories)) t1
group by 1;

但是这个查询不起作用,return 由 table flatten 命令编辑的值列看起来像 ["Beauty", "Makeup", "Eye Makeup", "Brows"] 所以当它运行计数操作时它只 returns 1. 我是否必须喜欢用 (",") 分割字符串然后走那条路?这很困难,因为这不是普通属性,元素被 {} 分解,大多数示例看起来都是这样,它只是使用 [].

似乎有 2 种方法可用于分解 JSON 数据,但我已尝试使用这两种方法,但似乎无法得到我想要的结果。

lateral flatten(input => product_attributes:data:web_categories) table(flatten(product_attributes:data:web_categories)) t1

如果有人能帮助我,我将不胜感激!

这是一种方法。如果 size(web_categories)==1 总是通过在第一个 flatten

中执行 web_catgories[0],则可以在 1 flatten 中执行此操作
with mytable as (select parse_json() product_attributes from values ('{
  "data": {
    "availability": "available",
    "product_company": "macys",
    "id": "22345897290",
    "price": 5.99,
    "web_categories": [
      [
        "Beauty",
        "Makeup",
        "Eye Makeup",
        "Brows"
      ]
    ]
  }}'))
  
select product_attributes:data:id::string as id, count(distinct(t1.value)) as number_of_categories
from mytable, lateral flatten(product_attributes:data:web_categories) t0, lateral flatten(t0.value) t1
group by 1;

ID  NUMBER_OF_CATEGORIES
22345897290 4