从snowflake中的子查询创建JSON

从snowflake中的子查询创建JSON,json,snowflake-cloud-data-platform,dbt,Json,Snowflake Cloud Data Platform,Dbt,我想从值列表中创建JSON字符串,但我以前从未使用过JSON。 请参见下图,了解我的两个表,以及我想在右侧创建的内容 我试过了,但没用(请原谅我的天真……但我认为这是它的逻辑实现) 我将非常感谢你的帮助。 我尝试过谷歌搜索,但我发现雪花文档非常混乱。以下是如何将行转换为单个JSON文档或一个JSON数组的示例: -- Get some rows from a sample table select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION; -

我想从值列表中创建JSON字符串,但我以前从未使用过JSON。 请参见下图,了解我的两个表,以及我想在右侧创建的内容

我试过了,但没用(请原谅我的天真……但我认为这是它的逻辑实现)

我将非常感谢你的帮助。
我尝试过谷歌搜索,但我发现雪花文档非常混乱。

以下是如何将行转换为单个JSON文档或一个JSON数组的示例:

-- Get some rows from a sample table
select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION;

-- Get each row as its own JSON using object_construct
select object_construct
(
    'NATION', N_NATIONKEY,
    'NAME', N_NAME,
    'REGION_KEY', N_REGIONKEY,
    'COMMENT', N_COMMENT
) as MY_JSON
from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."NATION";
                 
-- Get all rows as a JSON array by adding array_agg
select array_agg(object_construct
(
    'NATION', N_NATIONKEY,
    'NAME', N_NAME,
    'REGION_KEY', N_REGIONKEY,
    'COMMENT', N_COMMENT
)) as MY_JSON
from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."NATION";   

对于任一选项,请记住,JSON在Snowflake中被视为一个变体,并且有16mb的大小限制。

以下是如何将行转换为单个JSON文档或一个JSON数组的示例:

-- Get some rows from a sample table
select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION;

-- Get each row as its own JSON using object_construct
select object_construct
(
    'NATION', N_NATIONKEY,
    'NAME', N_NAME,
    'REGION_KEY', N_REGIONKEY,
    'COMMENT', N_COMMENT
) as MY_JSON
from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."NATION";
                 
-- Get all rows as a JSON array by adding array_agg
select array_agg(object_construct
(
    'NATION', N_NATIONKEY,
    'NAME', N_NAME,
    'REGION_KEY', N_REGIONKEY,
    'COMMENT', N_COMMENT
)) as MY_JSON
from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."NATION";   

对于任一选项,请记住,JSON在Snowflake中被视为一个变体,并且有16mb的大小限制。

您可以通过使用ArrayAg函数来实现这一点,ArrayAg函数将值旋转到数组中,并通过使用TO_JSON函数将其进一步转换为JSON

select 
  b.property_key PROPERTY_KEY,
  to_json(( arrayagg(b.APPLICATION_ID) within group (order by b.APPLICATION_ID) ) ) APPLICATION_IDS from table_b b, table_a a where b.property_key = a.property_key group by 1;

您可以使用ArrayAg函数来实现这一点,ArrayAg函数将值旋转到一个数组中,并使用TO_JSON函数将其进一步转换为JSON

select 
  b.property_key PROPERTY_KEY,
  to_json(( arrayagg(b.APPLICATION_ID) within group (order by b.APPLICATION_ID) ) ) APPLICATION_IDS from table_b b, table_a a where b.property_key = a.property_key group by 1;
使用window函数将列缩减为数组

创建表名(
姓瓦查尔,
第一个名字varchar
);
插入到名称中
(姓、名)
价值观
(“沃特曼”、“汤姆”),
(“沃特曼”、“亚历克斯”),
(‘沃特曼’、‘大卫’),
(“巴内特”、“丽贝卡”),
(‘巴内特’、‘安妮’);
选择
姓,
(按姓氏划分的)名字上方的数组(名字)
从名字;
上述查询产生以下结果:

LAST_NAME   FIRST_NAMES
waterman    ["tom", "alex", "david" ]
waterman    ["tom", "alex", "david" ]
waterman    ["tom", "alex", "david" ]
barnett     ["rebecca", "anne"  ]
barnett     ["rebecca", "anne"  ]
然后,您可以使用
distinct
操作符将其减少为唯一的
姓氏
姓氏

select
    distinct 
      last_name,
      array_agg(first_name) over (partition by last_name) first_names
from names;
要将
array\u agg
返回的值数组转换为JSON,只需使用
::variant
强制转换结果

选择
不同的
姓,
(按姓氏划分的)上的数组(名)::变量名
从名字;
使用窗口功能将列缩减为数组

创建表名(
姓瓦查尔,
第一个名字varchar
);
插入到名称中
(姓、名)
价值观
(“沃特曼”、“汤姆”),
(“沃特曼”、“亚历克斯”),
(‘沃特曼’、‘大卫’),
(“巴内特”、“丽贝卡”),
(‘巴内特’、‘安妮’);
选择
姓,
(按姓氏划分的)名字上方的数组(名字)
从名字;
上述查询产生以下结果:

LAST_NAME   FIRST_NAMES
waterman    ["tom", "alex", "david" ]
waterman    ["tom", "alex", "david" ]
waterman    ["tom", "alex", "david" ]
barnett     ["rebecca", "anne"  ]
barnett     ["rebecca", "anne"  ]
然后,您可以使用
distinct
操作符将其减少为唯一的
姓氏
姓氏

select
    distinct 
      last_name,
      array_agg(first_name) over (partition by last_name) first_names
from names;
要将
array\u agg
返回的值数组转换为JSON,只需使用
::variant
强制转换结果

选择
不同的
姓,
(按姓氏划分的)上的数组(名)::变量名
从名字;

谢谢,这很有魅力。我的array_agg没有给我引号,但那没关系。谢谢,这很有魅力。我的array_agg没有给我引号,但这并不重要。