簡體   English   中英

有沒有辦法在雪花中使用 sql 搜索 JSON 數組中的元素?

[英]Is there a way to search for an element inside a JSON array using sql in snowflake?

我在表中有一列,其中每一行都包含一個 JSONarray。 我需要為每一行從中提取某些相同的元素,但是,因為它是一個數組,所以數組中元素的順序並不總是相同的,我不能用它們的名字來調用這些元素。有沒有我有什么方法可以做一個 for 循環或類似的事情來遍歷數組的每個索引,當它不返回 null 時它會中斷?

Lukasz 出色答案的擴展:

使用帶有幾行“id, json”的 CTE,我們可以看到 FLATTEN 如何將其分開:

WITH fake_data(id, json) as (
    SELECT column1, parse_json(column2) FROM VALUES
        (1, '[1,2,3]'),
        (2, '{"4":4, "5":5}')
)
SELECT t.*
   ,f.*
FROM fake_data AS t
    ,LATERAL FLATTEN(INPUT => t.json) f
ID JSON 序列號 鑰匙 小路 指數 價值 這個
1個 [ 1, 2, 3 ] 1個 [0] 0 1個 [ 1, 2, 3 ]
1個 [ 1, 2, 3 ] 1個 [1] 1個 2個 [ 1, 2, 3 ]
1個 [ 1, 2, 3 ] 1個 [2] 2個 3個 [ 1, 2, 3 ]
2個 { “4”:4,“5”:5 } 2個 4個 ['4'] 4個 { “4”:4,“5”:5 }
2個 { “4”:4,“5”:5 } 2個 5個 ['5'] 5個 { “4”:4,“5”:5 }

Flatten 給出seqkeypathindexvaluethis

Seq:是輸入的行,如果您將行分開並想將它們合並在一起,但又不想混淆不同的行,這將非常有用。

鍵:如果被展平的東西是 object,則為屬性的名稱,第二行就是這種情況。

路徑:是訪問該值的方式。 又名t.json[2]會和你一起3

索引:如果是數組,就是進入object的步驟

值:是值

This:是循環的東西,對於獲取下一個等東西很有用。

不需要知道數組的大小:

CREATE OR REPLACE TABLE tab_name
AS
SELECT 1 AS id, PARSE_JSON('[1,2,3]') AS col_array
UNION ALL
SELECT 2 AS id, PARSE_JSON('[1]') AS col_array;

詢問:

SELECT t.id
   ,f.INDEX
   ,f.VALUE
FROM tab_name t
, LATERAL FLATTEN(INPUT => t.col_array) f
-- WHERE f.VALUE::INT = 1;

Output:

在此處輸入圖像描述

Lateral flatten 可以幫助提取 JSON object 的字段,是一個很好的替代方法,可以使用各自的名稱逐個提取它們。 但是,有時 JSON object 可以嵌套,通常提取這些嵌套對象需要知道它們的名稱。

這是一篇可能會幫助您動態提取多級字段的文章 JSON OBJECT 使用橫向展平

暫無
暫無

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

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