有没有办法在 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 给出 seq
、key
、path
、index
、value
和 this
Seq :是输入的行,如果您将行分开并想将它们重新合并在一起,但又不想混淆不同的行,这将非常有用。
Key : 是 属性 如果被展平的东西是一个对象的名称,第二行就是这种情况。
路径:是访问该值的方式。又名 t.json[2]
会和你一起 3
Index : 是进入对象的步骤,如果它是一个数组
值:是值
这是循环的东西,对于获取下一个等东西很有用
我在 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 给出 seq
、key
、path
、index
、value
和 this
Seq :是输入的行,如果您将行分开并想将它们重新合并在一起,但又不想混淆不同的行,这将非常有用。
Key : 是 属性 如果被展平的东西是一个对象的名称,第二行就是这种情况。
路径:是访问该值的方式。又名 t.json[2]
会和你一起 3
Index : 是进入对象的步骤,如果它是一个数组
值:是值
这是循环的东西,对于获取下一个等东西很有用