在雪花中使用扁平化:如何在 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 通常不被视为尊重顺序,所以这一切看起来相当危险。