Snowflake cloud data platform 使用数组和对象从多个值插入雪花表

Snowflake cloud data platform 使用数组和对象从多个值插入雪花表,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我正试图通过一条SQL语句在Snowflake中插入多个带有数组和结构的行。 要在列中插入值数组,我使用的是ARRAY\u CONSTRUCT函数,要插入结构/字典/对象,我使用的是OBJECT\u CONSTRUCT函数 例如 插入到“我的数据库”、“我的模式”、“我的表格” (“ID”、“TS”、“TEXT”、“DATEONLY”、“ARRAY”、“OBJ”、“BOOL”、“DOUBLE”、“INT”、“DEC_18_9”) 价值观 ('id1','2020-11-26 14:01:27.8

我正试图通过一条SQL语句在Snowflake中插入多个带有数组和结构的行。 要在列中插入值数组,我使用的是
ARRAY\u CONSTRUCT
函数,要插入结构/字典/对象,我使用的是
OBJECT\u CONSTRUCT
函数

例如

插入到“我的数据库”、“我的模式”、“我的表格”
(“ID”、“TS”、“TEXT”、“DATEONLY”、“ARRAY”、“OBJ”、“BOOL”、“DOUBLE”、“INT”、“DEC_18_9”)
价值观
('id1','2020-11-26 14:01:27.868','19','2020-11-26',
数组构造(0,1,2),对象构造('this','is','my','OBJECT','query',',
对象构造('field1','one','field2',数组构造('field2a','two'),
“field3”,数组构造(3,4,5)),假,178482300.96318725,912345619.876543190),
('id2','2020-11-26 14:01:27.868','19','2020-11-26',
数组构造(0,1,2),对象构造('this','is','my','OBJECT','query',',
对象构造('field1','one','field2',数组构造('field2a','two'),
“field3”,数组构造(3,4,5)),假,178482300.96318725,912345619.87654390)
;
这将导致一个例外:

SQL编译错误:VALUES子句中的表达式[ARRAY_CONSTRUCT(0,1,2)]无效

使用以下语法插入一行:

插入到“我的数据库”、“我的模式”、“我的表格”
(“ID”、“TS”、“TEXT”、“DATEONLY”、“ARRAY”、“OBJ”、“BOOL”、“DOUBLE”、“INT”、“DEC_18_9”)
选择“id1”、“2020-11-26 14:01:27.868”、“19”、“2020-11-26”,
数组构造(0,1,2),对象构造('this','is','my','OBJECT','query',',
对象构造('field1','one','field2',数组构造('field2a','two'),
“field3”,数组构造(3,4,5)),假,178482300.96318725,912345619.876543190
;
然而,目前尚不清楚这是否以及如何用于插入多行

表定义为:

创建或替换临时表“MY_DB”、“MY_架构”、“MY_表”
(“ID”字符串不为空,“TS”时间戳不为空,“文本”字符串,
“DATEONLY”日期,“ARRAY”数组,“OBJ”对象,“BOOL”布尔值,
“DOUBLE”DOUBLE,“INT”BIGINT,“DEC_18_9”数字(18,9)
);
正确的方法是什么? (我是否需要将数据溢出到一个文件中并从该文件加载,或者是否有直接的方法来完成此操作?)

我只在一封信中提到了这一点


为了澄清,我将数据插入到一个临时表中,并从中合并到另一个表中,因为我找不到通过SQL语句从值(即不从表)合并数据的方法。

值不支持数组构造表达式,这就是为什么会出现“无效表达式”错误:

大多数简单的算术表达式和字符串函数都可以 在编译时求值,但大多数其他表达式不能

您可以使用SELECT+UNION ALL而不是值:

insert into "MY_DB"."MY_SCHEMA"."MY_TABLE"
("ID", "TS", "TEXT", "DATEONLY", "ARRAY", "OBJ", "BOOL", "DOUBLE", "INT", "DEC_18_9")
SELECT 'id1', '2020-11-26 14:01:27.868', '19', '2020-11-26',
  ARRAY_CONSTRUCT(0, 1, 2), OBJECT_CONSTRUCT('this', 'is', 'my', 'object', 'query',
  OBJECT_CONSTRUCT('field1', 'one', 'field2', ARRAY_CONSTRUCT('field2a', 'two')),
  'field3', ARRAY_CONSTRUCT(3, 4, 5)), FALSE, 178482300.96318725, 9, 12345619.876543190
UNION ALL  
SELECT 'id2', '2020-11-26 14:01:27.868', '19', '2020-11-26',
  ARRAY_CONSTRUCT(0, 1, 2), OBJECT_CONSTRUCT('this', 'is', 'my', 'object', 'query',
  OBJECT_CONSTRUCT('field1', 'one', 'field2', ARRAY_CONSTRUCT('field2a', 'two')),
  'field3', ARRAY_CONSTRUCT(3, 4, 5)), FALSE, 178482300.96318725, 9, 12345619.876543190;

值不支持数组_构造表达式,这就是为什么会出现“无效表达式”错误:

大多数简单的算术表达式和字符串函数都可以 在编译时求值,但大多数其他表达式不能

您可以使用SELECT+UNION ALL而不是值:

insert into "MY_DB"."MY_SCHEMA"."MY_TABLE"
("ID", "TS", "TEXT", "DATEONLY", "ARRAY", "OBJ", "BOOL", "DOUBLE", "INT", "DEC_18_9")
SELECT 'id1', '2020-11-26 14:01:27.868', '19', '2020-11-26',
  ARRAY_CONSTRUCT(0, 1, 2), OBJECT_CONSTRUCT('this', 'is', 'my', 'object', 'query',
  OBJECT_CONSTRUCT('field1', 'one', 'field2', ARRAY_CONSTRUCT('field2a', 'two')),
  'field3', ARRAY_CONSTRUCT(3, 4, 5)), FALSE, 178482300.96318725, 9, 12345619.876543190
UNION ALL  
SELECT 'id2', '2020-11-26 14:01:27.868', '19', '2020-11-26',
  ARRAY_CONSTRUCT(0, 1, 2), OBJECT_CONSTRUCT('this', 'is', 'my', 'object', 'query',
  OBJECT_CONSTRUCT('field1', 'one', 'field2', ARRAY_CONSTRUCT('field2a', 'two')),
  'field3', ARRAY_CONSTRUCT(3, 4, 5)), FALSE, 178482300.96318725, 9, 12345619.876543190;

通过反复试验,我找到了以下解决方案:

插入到“我的数据库”、“我的模式”、“我的表格”
选择$1、$2、$3、$4、PARSE_JSON($5)、PARSE_JSON($6)、$7、$8、$9、$10
从价值观
('id1','2020-11-26 14:01:27.868','19','2020-11-26','[0,1,2]',
{“this”:“is”,“my”:“object”,
“查询”:{“字段1”:“一”,“字段2”:[“字段2a”,“两”],“字段3”:[3,4,5]},
假,178482300.96318725,912345619.876543190),,
('id2','2020-11-26 14:01:27.868','19','2020-11-26','[0,1,2]',
{“this”:“is”,“my”:“object”,
“查询”:{“字段1”:“一”,“字段2”:[“字段2a”,“两”],“字段3”:[3,4,5]},
假,178482300.96318725,92345619.87654390)
;

仅供参考,通过一个简短的测试,Snowflake在JSON中识别
NaN
-inf
inf
,而周围没有引号作为浮点值,例如
{“my_field”:NaN}

,通过反复试验,我找到了以下解决方案:

插入到“我的数据库”、“我的模式”、“我的表格”
选择$1、$2、$3、$4、PARSE_JSON($5)、PARSE_JSON($6)、$7、$8、$9、$10
从价值观
('id1','2020-11-26 14:01:27.868','19','2020-11-26','[0,1,2]',
{“this”:“is”,“my”:“object”,
“查询”:{“字段1”:“一”,“字段2”:[“字段2a”,“两”],“字段3”:[3,4,5]},
假,178482300.96318725,912345619.876543190),,
('id2','2020-11-26 14:01:27.868','19','2020-11-26','[0,1,2]',
{“this”:“is”,“my”:“object”,
“查询”:{“字段1”:“一”,“字段2”:[“字段2a”,“两”],“字段3”:[3,4,5]},
假,178482300.96318725,92345619.87654390)
;
仅供参考,通过一个简短的测试,Snowflake在JSON中识别
NaN
-inf
inf
,而周围没有引号作为浮点值,例如
{“my_field”:NaN}