我有这样的疑问:
create or replace table test_json as
select
parse_json('{
"include": [
"x",
"y",
"z"
]
}') AS val
union all
select
parse_json('{
"exclude": [
"a",
"b"
],
"include": [
"d",
"e"
]
}');
with source_cte as (
select val, i.value::TEXT as include_symbol
from test_json, lateral flatten(input=>val:include) as i
)
select
include_symbol,
e.value::TEXT as exclude_symbol
from source_cte LEFT JOIN LATERAL FLATTEN(input=>val:exclude) e
结果如下:
INCLUDE_SYMBOL EXCLUDE_SYMBOL
d a
d b
e a
e b
它不会返回包含 = x, y, z 的行,就像我使用 INNER JOIN LATERAL FLATTEN 一样,但我使用的是 LEFT JOIN。
这是雪花中的一些错误吗? 对于这种情况如何实现 LEFT JOIN 行为?我的意思是显示 include_symbol 无论是否在
left join lateral flatten
表达式中找到匹配(并在这种情况下在 exclude_symbol 列中显示空值)。
这可以写得更简单:
with test_json(val) as (
select parse_json($1) from values
('{"include": ["x","y","z"]}'),
('{"exclude":["a","b"],"include":["d","e"]}')
)
select
val
,i.value::TEXT as include_symbol
,e.value::TEXT as exclude_symbol
from test_json,
table(flatten(input=>val:include)) as i,
table(flatten(input=>val:exclude)) as e;
然后迈克指出的修复可以用于排除展平:
with test_json(val) as (
select parse_json($1) from values
('{"include": ["x","y","z"]}'),
('{"exclude":["a","b"],"include":["d","e"]}')
)
select
val
,i.value::TEXT as include_symbol
,e.value::TEXT as exclude_symbol
from test_json,
table(flatten(input=>val:include)) as i,
table(flatten(input=>val:exclude, outer=>true)) as e;
然后也可以删除 val:
with test_json(val) as (
select parse_json($1) from values
('{"include": ["x","y","z"]}'),
('{"exclude":["a","b"],"include":["d","e"]}')
)
select
i.value::TEXT as include_symbol
,e.value::TEXT as exclude_symbol
from test_json,
table(flatten(input=>val:include)) as i,
table(flatten(input=>val:exclude, outer=>true)) as e;
对于您的桌子来说,如下所示:
select
i.value::TEXT as include_symbol
,e.value::TEXT as exclude_symbol
from test_json,
table(flatten(input=>val:include)) as i,
table(flatten(input=>val:exclude, outer=>true)) as e;