雪花表有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);
答案 0 :(得分:1)
当我对地址2进行扁平化查询时,因为一条记录包含数组,我只会分解出第三条记录
Snowflake中的default behaviour of the FLATTEN
table function将跳过任何没有扩展结构的列,而OUTER
参数控制此行为。引用上面文档链接中的相关部分(强调我的意思):
OUTER
=>TRUE
|FALSE
如果
FALSE
是任何不能扩展的输入行 ,或者是因为它们不能在路径中访问,或者是因为它们具有零个字段或条目,所以从输出。如果为
TRUE
,则为零行扩展生成精确的一行(NULL
,KEY
和INDEX
列中有VALUE
)。默认:
FALSE
由于VARIANT
数据的格式奇异,因此您需要利用conditional expressions和data 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
。