【问题标题】:Snowflake: IFNULL can not be used in the subSQL of INSERT VALUESSnowflake:IFNULL 不能在 INSERT VALUES 的 subSQL 中使用
【发布时间】:2019-08-18 14:39:34
【问题描述】:

尝试在 INSERT VALUES 子句中使用 IFNULL 时出现编译错误。

SQL:

INSERT INTO widgets 
VALUES 
(12, (select ifnull(max(c), 0)+1 from DCSN_Testing where c = 1), 444)

错误

SQL compilation error: Invalid expression 
[(SELECT (NULLABILITY_EXTERNAL(1)) + 1 AS "IFNULL(MAX(C), 0)+1" 
FROM (VALUES (null)) DCSN_TESTING WHERE TRUE)] in VALUES clause

【问题讨论】:

  • 目前 Snowflake 对可以放入 VALUES 子句的内容的支持有限。最安全的做法是只将常量放在那里,然后将 INSERT..SELECT 用于其他任何内容,就像 Rich 建议的那样。
  • @MarcinZukowski,但这仅适用于一排?一堆记录呢?
  • 您始终可以使用 UNION ALL。我看到了您对 MAX 的评论,但很难理解问题所在。如果您提供完整的复制案例,帮助您会容易得多。
  • @Marcin Zukowski 有关此问题的详细信息,请参阅此链接:stackoverflow.com/questions/55367597/…

标签: sql-insert snowflake-cloud-data-platform ifnull


【解决方案1】:

我通常在 INSERT 的 VALUES 语句中没有子选择,事实上我不记得在我编写的所有 SQL 中做过一个。

也就是说,我建议您尝试以下我称之为“INSERT INTO SELECT”或 Snowflake 文档称之为“使用查询插入单行”的示例,IMO 是编写 SQL 的一种简单/干净的方式.

注意:这已经在 Snowflake 上进行了测试。

-- this is a simple test table, represents your 
--   DCSN_Testing table, results are a value of 5
SELECT IFNULL(MAX(id), 0)+1 FROM first_names;

-- create a test table
DROP TABLE stackoverflow_55387209;
CREATE TABLE stackoverflow_55387209(id NUMBER, 
    new_id NUMBER, other_id  NUMBER);

-- test for your error, results confirm your findings
INSERT INTO stackoverflow_55387209 (id, new_id, other_id)
VALUES (12, (select max(ifnull(id, 0) + 1)  FROM first_names), 444) ;
results:  
SQL compilation error: Invalid expression [(SELECT MAX((NULLABILITY_EXTERNAL(FIRST_NAMES.ID)) + 1) AS "NEW_ID" 
FROM FIRST_NAMES AS FIRST_NAMES)] in VALUES clause

-- rewrite to "INSERT INTO SELECT" type of SQL Query, as described in documentation
--      https://docs.snowflake.net/manuals/sql-reference/sql/insert.html#single-row-insert-using-a-query
INSERT INTO stackoverflow_55387209
SELECT 12, MAX(IFNULL(id, 0) + 1), 444  FROM first_names ;
results:  number of rows inserted = 1

【讨论】:

  • 谢谢,@Rich Murname。但是,INSERT INTO SELECT 只支持插入单行。一堆数据需要插入到雪花中怎么样?我试图在两个 SELECT 之间执行“Union ALL”,但不幸的是,“Max”函数获得了相同的值而不是增量值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多