有没有办法在 snowflake 中使用 sql 在 JSON 数组中搜索元素?

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

我在 table 中有一列,其中每一行都包含一个 JSONarray。我需要为每一行从中提取某些相同的元素,但是,因为它是一个数组,所以数组中元素的顺序并不总是相同的,我不能通过它们的 names.Is 来调用这些元素有一种方法可以让我做一个 for 循环或类似的东西遍历数组的每个索引,当它不 return null 时它会中断吗?

不需要知道数组的大小:

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;

输出:

Lateral flatten 可以帮助提取 JSON 对象的字段,并且是使用各自名称逐个提取它们的一个很好的替代方法。但是,有时 JSON 对象可以嵌套,通常提取这些嵌套对象需要知道它们的名称。

这篇文章可能会对您有所帮助 DYNAMICALLY EXTRACT THE FIELDS OF A MULTI-LEVEL JSON OBJECT USING LATERAL FLATTEN

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 SEQ KEY PATH INDEX VALUE THIS
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 :是输入的行,如果您将行分开并想将它们重新合并在一起,但又不想混淆不同的行,这将非常有用。

Key : 是 属性 如果被展平的东西是一个对象的名称,第二行就是这种情况。

路径:是访问该值的方式。又名 t.json[2] 会和你一起 3

Index : 是进入对象的步骤,如果它是一个数组

值:是值

这是循环的东西,对于获取下一个等东西很有用