簡體   English   中英

從雪花中的子查詢創建 JSON

[英]Create JSON from a subquery in snowflake

我想從值列表創建一個 JSON 字符串,但我以前從未使用過 JSON。 請參閱下圖了解我的 2 個表,以及我想在右側創建的內容。

在此處輸入圖片說明

我試過這個,但它不起作用(原諒我的天真......但我認為這將是它的邏輯實現)

select a.property_key
      ,to_JSON( select application_ID from tableB where a.property_key = b.property_key) as application_list
  from tableA a

我將不勝感激。 我試過谷歌搜索,但我發現雪花文檔非常混亂。

以下是如何將行轉換為單個 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 的大小限制。

使用窗口函數array_agg將列縮減為數組。

create table names (
  last_name varchar,
  first_name varchar
);

insert  into names 
    (last_name, first_name) 
values 
    ('waterman', 'tom'), 
    ('waterman', 'alex'),
    ('waterman', 'david'),
    ('barnett', 'rebecca'),
    ('barnett', 'anne');
    
select
    last_name,
    array_agg(first_name) over (partition by last_name) first_names
from names;

上面的查詢產生以下結果:

LAST_NAME   FIRST_NAMES
waterman    ["tom", "alex", "david" ]
waterman    ["tom", "alex", "david" ]
waterman    ["tom", "alex", "david" ]
barnett     ["rebecca", "anne"  ]
barnett     ["rebecca", "anne"  ]

然后,您可以使用distinct運算符將其減少到唯一的last_name , first_name對。

select
    distinct 
      last_name,
      array_agg(first_name) over (partition by last_name) first_names
from names;

要將array_agg返回的值數組轉換為 JSON,您可以使用::variant簡單地轉換結果。

select
    distinct 
      last_name,
      array_agg(first_name) over (partition by last_name)::variant first_names
from names;

您可以使用 ARRAYAGG 函數將值轉換為數組,並使用 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM