雪花展平查询数组

时间:2020-05-25 15:34:02

标签: arrays snowflake-cloud-data-platform

雪花表有1个Variant列,并装有3个JSON记录。 JSON记录如下。

{“地址”:{“城市”:“列克星敦”,“地址1”:“ 316 Tarrar Springs Rd”,“地址2”:空} {“地址”:{“城市”:“哈特福德”,“地址1” “:” 318 Springs Rd“,” Address2“:” 319 Springs Rd“} {” address“:{” City“:” Avon“,” Address1“:” 38 Springs Rd“,” Address2“:[{” txtvalue “:null},{” txtvalue“:”第1行“},{” Line1“:”第1行“}]}

如果您查看JSON中的Address2字段,则第一个包含NULL,第二个字符串和第三个一个数组。

当我对一个地址2进行扁平化查询时,因为一个记录保存了数组,我只得到了爆炸的第三个记录。如何在单个查询中获得所有2个具有爆炸值的记录。

选择数据:地址:城市::字符串,数据:地址:地址1 ::字符串,值:文本值::字符串 从add1开始,横向展平(输入=> data:address:Address2);

1 个答案:

答案 0 :(得分:1)

当我对地址2进行扁平化查询时,因为一条记录包含数组,我只会分解出第三条记录

Snowflake中的default behaviour of the FLATTEN table function将跳过任何没有扩展结构的列,而OUTER参数控制此行为。引用上面文档链接中的相关部分(强调我的意思):

OUTER => TRUE | FALSE

如果FALSE是任何不能扩展的输入行 ,或者是因为它们不能在路径中访问,或者是因为它们具有零个字段或条目,所以从输出

如果为TRUE,则为零行扩展生成精确的一行(NULLKEYINDEX列中有VALUE)。

默认:FALSE

由于VARIANT数据的格式奇异,因此您需要利用conditional expressionsdata type predicates来检查扩展行中的列是否为ARRAY类型,VARCHAR或其他内容,然后使用结果发出正确的值。

一个示例查询,说明了以上所有方法的使用:

SELECT
    t.v:address.City AS city
  , t.v:address.Address1 AS address1
  , CASE
        WHEN IS_ARRAY(t.v:address.Address2) THEN f.value:txtvalue::string
        ELSE t.v:address.Address2::string
    END AS address2
FROM
    add1 t
  , LATERAL FLATTEN(INPUT => v:address.Address2, OUTER => TRUE) f;

P.s。考虑在输入或源处对输入进行标准化,以降低查询的复杂性。

注意::您的数据示例不一致(对象数组没有同质的键),但是通过您的示例查询,我假设该数组中对象的所有键都将被命名txtvalue