【问题标题】:Snowflake Seems to Auto-Cast VARCHAR to NUMERIC for Insert into VARCHAR FieldSnowflake 似乎自动将 VARCHAR 转换为 NUMERIC 以插入 VARCHAR 字段
【发布时间】:2021-12-10 01:35:35
【问题描述】:

当尝试将数据插入雪花表时,不正确转换输入值的假定类型似乎可能会覆盖表创建命令提供的数据类型。例如,给定一个如下创建的表:

CREATE TABLE vctable (
    itemA VARCHAR(8),
    itemB VARCHAR(8)
);

以下命令失败:

INSERT INTO vctable (itemA, itemB) VALUES ('hi','ho'), (1,2);
ERROR: Numeric value 'hi' is not recognized

我预计此插入会失败,因为 second 记录的数据类型与表定义不匹配(正如预期的那样,如果我将第二条记录的元素转换为字符串,则插入成功)。但是错误表明失败是因为 Snowflake 无法将第一个(格式正确)记录中的“hi”转换为数值。就好像在调查了输入之后,Snowflake 决定覆盖表中声明的数据类型。为什么 Snowflake 试图从表定义中转换字符串 远离

顺便说一句,如果插入被分成两个单独的语句,那么两个都可以工作。

【问题讨论】:

  • 可能值得用 Snowflake Support 作为一个 bug 打开一张票。这可能与优化器如何评估操作顺序有关,但这并不重要为什么......它真的根本不应该抛出错误。我希望在这种情况下将数字隐式转换为 varchar。

标签: snowflake-cloud-data-platform


【解决方案1】:

执行顺序。

INSERT INTO vctable (itemA, itemB) VALUES ('hi','ho'), (1,2);

有点等价于

INSERT INTO vctable
select 'hi','ho'
union all select 1, 2;

其中有子查询:

select 'hi','ho'
union select 1, 2

Numeric value 'hi' is not recognized 失败。

然后你会注意到,即使这样也失败了:

select $1::varchar, $2::varchar
from VALUES ('hi','ho'), (1, 2);

即使是select 级别的演员也为时已晚,因为values() 需要先运行。

【讨论】:

    【解决方案2】:

    您必须在 VALUES 子句级别将数值转换为字符串,试试这个:

    INSERT INTO vctable (itemA, itemB) VALUES ('hi','ho'), (1::string,2::string);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多