在雪花中使用扁平化:如何在 JSON 中定位特定的嵌套子项?
using flatten in snowflake: How to target specific nested child in JSON?
我有这个问题。我试图只获取元素编号 2(第二个 'element'),但我不确定如何定位那个 'element'。下面的代码给出了所有元素
select column,
a.value:element: ready
from table_name
,lateral flatten(input => RAW:root)a
上下文:
"root": [
{
"element": {
"ready": "some stuff here",
"max": "some stuff here"
},
"bee": {
"value": "some stuff here",
"name": "some stuff here"
}
},
{
"element": {
"ready": "some valuable stuff here",
"Name": "some valuable stuff here"
},
仅将此 CTE 用于数据:
WITH table_name as (
SELECT PARSE_JSON('{"root": [
{
"element": {
"ready": "some stuff here",
"max": "some stuff here"
},
"bee": {
"value": "some stuff here",
"name": "some stuff here"
}
},
{
"element": {
"ready": "some valuable stuff here",
"Name": "some valuable stuff here"
}
}]}') as RAW
)
要仅获取“第二个”元素,请对其进行硬编码!
SELECT
raw:root[1]:element:ready as ready,
raw:root[1]:element:Name as name
FROM table_name;
READY
NAME
"some valuable stuff here"
"some valuable stuff here"
或者您可以过滤 FLATTEN 结果并只接受索引 = 2;
select
a.value:element:ready as ready
,a.value:element:Name as name
from table_name
,lateral flatten(input => RAW:root) a
WHERE a.index = 1
READY
NAME
"some valuable stuff here"
"some valuable stuff here"
仍然很恶心,所以也许你想要“第二个元素”,因此一些 pre-filtered by IS_NULL_VALUE 然后是 QUALIFY
WITH table_name as (
SELECT PARSE_JSON('{"root": [
{"non-element":123},
{
"element": {
"ready": "some stuff here",
"max": "some stuff here"
},
"bee": {
"value": "some stuff here",
"name": "some stuff here"
}
},
{
"element": {
"ready": "some valuable stuff here",
"Name": "some valuable stuff here"
}
}]}') as RAW
)
select
a.value:element:ready as ready
,a.value:element:Name as name1
from table_name
,lateral flatten(input => RAW:root) a
WHERE is_null_value(a.value:element) = false
QUALIFY ROW_NUMBER() OVER (ORDER BY a.index ) = 2
给出:
READY
NAME1
"some valuable stuff here"
"some valuable stuff here"
但是这些都是特定于顺序的,并且 JSON 通常不被视为尊重顺序,所以这一切看起来相当危险。
我有这个问题。我试图只获取元素编号 2(第二个 'element'),但我不确定如何定位那个 'element'。下面的代码给出了所有元素
select column,
a.value:element: ready
from table_name
,lateral flatten(input => RAW:root)a
上下文:
"root": [
{
"element": {
"ready": "some stuff here",
"max": "some stuff here"
},
"bee": {
"value": "some stuff here",
"name": "some stuff here"
}
},
{
"element": {
"ready": "some valuable stuff here",
"Name": "some valuable stuff here"
},
仅将此 CTE 用于数据:
WITH table_name as (
SELECT PARSE_JSON('{"root": [
{
"element": {
"ready": "some stuff here",
"max": "some stuff here"
},
"bee": {
"value": "some stuff here",
"name": "some stuff here"
}
},
{
"element": {
"ready": "some valuable stuff here",
"Name": "some valuable stuff here"
}
}]}') as RAW
)
要仅获取“第二个”元素,请对其进行硬编码!
SELECT
raw:root[1]:element:ready as ready,
raw:root[1]:element:Name as name
FROM table_name;
READY | NAME |
---|---|
"some valuable stuff here" | "some valuable stuff here" |
或者您可以过滤 FLATTEN 结果并只接受索引 = 2;
select
a.value:element:ready as ready
,a.value:element:Name as name
from table_name
,lateral flatten(input => RAW:root) a
WHERE a.index = 1
READY | NAME |
---|---|
"some valuable stuff here" | "some valuable stuff here" |
仍然很恶心,所以也许你想要“第二个元素”,因此一些 pre-filtered by IS_NULL_VALUE 然后是 QUALIFY
WITH table_name as (
SELECT PARSE_JSON('{"root": [
{"non-element":123},
{
"element": {
"ready": "some stuff here",
"max": "some stuff here"
},
"bee": {
"value": "some stuff here",
"name": "some stuff here"
}
},
{
"element": {
"ready": "some valuable stuff here",
"Name": "some valuable stuff here"
}
}]}') as RAW
)
select
a.value:element:ready as ready
,a.value:element:Name as name1
from table_name
,lateral flatten(input => RAW:root) a
WHERE is_null_value(a.value:element) = false
QUALIFY ROW_NUMBER() OVER (ORDER BY a.index ) = 2
给出:
READY | NAME1 |
---|---|
"some valuable stuff here" | "some valuable stuff here" |
但是这些都是特定于顺序的,并且 JSON 通常不被视为尊重顺序,所以这一切看起来相当危险。