繁体   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