Snowflake cloud data platform 在Snowflake中查询变量数据

Snowflake cloud data platform 在Snowflake中查询变量数据,snowflake-cloud-data-platform,flatten,variant,querying,Snowflake Cloud Data Platform,Flatten,Variant,Querying,下面是我在示例中使用的数据变量源表。我想做一个查询,将这个数据从一个变量src解析到一个雪花表中 { "col1": bool, "col2": null, "col3": "datetime", "col4": int, "col5": "string", "col6": "string", "array": [ { "x": bool, "y": null,

下面是我在示例中使用的数据变量源表。我想做一个查询,将这个数据从一个变量src解析到一个雪花表中

{
    "col1": bool,
    "col2": null,
    "col3": "datetime",
    "col4": int,
    "col5": "string",
    "col6": "string",
    "array": [
        {
            "x": bool,
            "y": null,
            "v": "datetime",
            "z": int,
           "w": "string",
            "q": "string",
            "obj": {
                    "a": "bool",
                     "b": "float"
                   },
    "col7": "datetime"
}
]
}
--这是我试过的

SELECT 

     src:col1::string as col1,
     src:col2::string as col2,
     src:col3::string as col3,
     src:col4::string as col4,
     src:col5::string as col5,
     src:col6::string as col6,

     s.value:x::string as S_x,
     s.value:y::string as s_y,
     s.value:v::string as s_v,
     s.value:z::string as s_z,
     s.value:w::string as s_w,
     s.value:q::string as s_q,

     s.value:obj.value:a::string as s_obj_a,
     s.value:obj.value:b::string as s_obj_b,

     src:col7::string as col7 
FROM tblvariant
    , table(flatten(src:s)) s
    ;
除了这两列(a,b)为空,而它们应该包含它们的数据之外,其他一切都正常工作。 有什么建议吗?
非常感谢

示例JSON与SQL不匹配。“阶段”和“元数据”在哪里?无论如何,这个问题似乎与额外的“值”关键字有关

create or replace table tblvariant ( src variant )
as select parse_json (' 
{
    "col1": "bool",
    "col2": null,
    "col3": "datetime",
    "col4": "int",
    "col5": "string",
    "col6": "string",
    "stages": [
        {
            "x": "bool",
            "y": null,
            "v": "datetime",
            "z": "int",
           "w": "string",
            "q": "string",
            "obj": {
                    "a": "bool",
                     "b": "float"
                   },
    "col7": "datetime"
}
]
}' );
如您所见,我修改了示例JSON并将“array”重命名为“stages”(根据您的SQL)。此SQL检索a和b的值:

SELECT 
     src:col1::string as col1,
     src:col2::string as col2,
     src:col3::string as col3,
     src:col4::string as col4,
     src:col5::string as col5,
     src:col6::string as col6,
     s.value:x::string as S_x,
     s.value:y::string as s_y,
     s.value:v::string as s_v,
     s.value:z::string as s_z,
     s.value:w::string as s_w,
     s.value:q::string as s_q,

     s.value:obj.a::string as s_obj_a,
     s.value:obj.b::string as s_obj_b,

     src:col7::string as col7 
FROM tblvariant
   , table(flatten(src:stages)) s
   -- , table(flatten(s.value:metadata)) m
    ;

示例JSON与SQL不匹配。“阶段”和“元数据”在哪里?无论如何,这个问题似乎与额外的“值”关键字有关

create or replace table tblvariant ( src variant )
as select parse_json (' 
{
    "col1": "bool",
    "col2": null,
    "col3": "datetime",
    "col4": "int",
    "col5": "string",
    "col6": "string",
    "stages": [
        {
            "x": "bool",
            "y": null,
            "v": "datetime",
            "z": "int",
           "w": "string",
            "q": "string",
            "obj": {
                    "a": "bool",
                     "b": "float"
                   },
    "col7": "datetime"
}
]
}' );
如您所见,我修改了示例JSON并将“array”重命名为“stages”(根据您的SQL)。此SQL检索a和b的值:

SELECT 
     src:col1::string as col1,
     src:col2::string as col2,
     src:col3::string as col3,
     src:col4::string as col4,
     src:col5::string as col5,
     src:col6::string as col6,
     s.value:x::string as S_x,
     s.value:y::string as s_y,
     s.value:v::string as s_v,
     s.value:z::string as s_z,
     s.value:w::string as s_w,
     s.value:q::string as s_q,

     s.value:obj.a::string as s_obj_a,
     s.value:obj.b::string as s_obj_b,

     src:col7::string as col7 
FROM tblvariant
   , table(flatten(src:stages)) s
   -- , table(flatten(s.value:metadata)) m
    ;
s、 值:obj。值:a:字符串为s_obj_a

s、 值:obj。值:b:字符串为s_obj_b

可以使用来访问对象的键。您无需使用来访问这些字段:

s.value:metadata.a::字符串作为s\m\u a,
s、 值:metadata.b::字符串为s_m_b,
您也不需要在
阶段
数组中的
元数据
对象上运行一秒钟,除非您确实需要每个
元数据
键有一个排他行,假设
元数据
是对象类型而不是嵌套数组。如果您只想将值提取到与每个数组行相同的级别,那么使用上面的方法就足够了

s、 值:obj。值:a:字符串为s_obj_a

s、 值:obj。值:b:字符串为s_obj_b

可以使用来访问对象的键。您无需使用来访问这些字段:

s.value:metadata.a::字符串作为s\m\u a,
s、 值:metadata.b::字符串为s_m_b,
您也不需要在
阶段
数组中的
元数据
对象上运行一秒钟,除非您确实需要每个
元数据
键有一个排他行,假设
元数据
是对象类型而不是嵌套数组。如果您只想将值提取到与每个数组行相同的级别,那么使用上面的方法就足够了