Snowflake JSON 外文动态转表格格式
Snowflake JSON with foreign language to tabular format dynamically
我通读了 snowflake 文档和网络,发现只有 https://whosebug.com/users/12756381/greg-pavlik which can be found here
解决了我的问题
这不适用于具有俄语属性名称和属性值的数据。可以为此进行哪些修改以适合我的情况?
这是一个例子:
create or replace table target_json_table(
v variant
);
INSERT INTO target_json_table SELECT parse_json('{
"at": {
"cf": "NV"
},
"pd": {
"мо": "мо",
"ä": "ä",
"retailerName": "retailer",
"productName":"product"
}
}');
call create_view_over_json('target_json_table', 'V', 'MY_VIEW');
错误:创建视图时遇到错误。 SQL 编译错误:位置 7 处的语法错误行 7 意外 'ä:'。位置 7 处的语法错误第 8 行出现意外的“мо”。
作为存储过程创建基础的原始 SQL 中存在错误。我已经更正了。您可以在 Github 页面上获取更新。更改的部分在这里:
sql =
`
SELECT DISTINCT '"' || array_to_string(split(f.path, '.'), '"."') || '"' AS path_nAme, -- This generates paths with levels enclosed by double quotes (ex: "path"."to"."element"). It also strips any bracket-enclosed array element references (like "[0]")
DECODE (substr(typeof(f.value),1,1),'A','ARRAY','B','BOOLEAN','I','FLOAT','D','FLOAT','STRING') AS attribute_type, -- This generates column datatypes of ARRAY, BOOLEAN, FLOAT, and STRING only
'"' || array_to_string(split(f.path, '.'), '.') || '"' AS alias_name -- This generates column aliases based on the path
FROM
@~TABLE_NAME~@,
LATERAL FLATTEN(@~COL_NAME~@, RECURSIVE=>true) f
WHERE TYPEOF(f.value) != 'OBJECT'
AND NOT contains(f.path, '[') -- This prevents traversal down into arrays
limit ${ROW_SAMPLE_SIZE}
`;
以前 SQL 只是用下划线替换了 non-ASCII 个字符。更新后的 SQL 会将键名用双引号括起来以创建 non-ASCII 个键名。
确保这就是您希望它执行的操作。此外,键是嵌套的。我决定最好的处理方法是在视图中使用点符号创建列名,例如一个列名是 pd.ä
。这将需要用双引号将列名括起来,例如:
select * from MY_VIEW where "pd.ä" = 'ä';
最后说明:您的存储过程的名称是 create_view_over_json
,但是,在 Github 项目中名称是 create_view_over_variant
。更新时,一定要调用正确的程序。
我通读了 snowflake 文档和网络,发现只有 https://whosebug.com/users/12756381/greg-pavlik which can be found here
这不适用于具有俄语属性名称和属性值的数据。可以为此进行哪些修改以适合我的情况? 这是一个例子:
create or replace table target_json_table(
v variant
);
INSERT INTO target_json_table SELECT parse_json('{
"at": {
"cf": "NV"
},
"pd": {
"мо": "мо",
"ä": "ä",
"retailerName": "retailer",
"productName":"product"
}
}');
call create_view_over_json('target_json_table', 'V', 'MY_VIEW');
错误:创建视图时遇到错误。 SQL 编译错误:位置 7 处的语法错误行 7 意外 'ä:'。位置 7 处的语法错误第 8 行出现意外的“мо”。
作为存储过程创建基础的原始 SQL 中存在错误。我已经更正了。您可以在 Github 页面上获取更新。更改的部分在这里:
sql =
`
SELECT DISTINCT '"' || array_to_string(split(f.path, '.'), '"."') || '"' AS path_nAme, -- This generates paths with levels enclosed by double quotes (ex: "path"."to"."element"). It also strips any bracket-enclosed array element references (like "[0]")
DECODE (substr(typeof(f.value),1,1),'A','ARRAY','B','BOOLEAN','I','FLOAT','D','FLOAT','STRING') AS attribute_type, -- This generates column datatypes of ARRAY, BOOLEAN, FLOAT, and STRING only
'"' || array_to_string(split(f.path, '.'), '.') || '"' AS alias_name -- This generates column aliases based on the path
FROM
@~TABLE_NAME~@,
LATERAL FLATTEN(@~COL_NAME~@, RECURSIVE=>true) f
WHERE TYPEOF(f.value) != 'OBJECT'
AND NOT contains(f.path, '[') -- This prevents traversal down into arrays
limit ${ROW_SAMPLE_SIZE}
`;
以前 SQL 只是用下划线替换了 non-ASCII 个字符。更新后的 SQL 会将键名用双引号括起来以创建 non-ASCII 个键名。
确保这就是您希望它执行的操作。此外,键是嵌套的。我决定最好的处理方法是在视图中使用点符号创建列名,例如一个列名是 pd.ä
。这将需要用双引号将列名括起来,例如:
select * from MY_VIEW where "pd.ä" = 'ä';
最后说明:您的存储过程的名称是 create_view_over_json
,但是,在 Github 项目中名称是 create_view_over_variant
。更新时,一定要调用正确的程序。