1

我们创建了一个如图所示的雪花表,并使用复制到命令将数据从平面文件加载到

create or replace table temp.T_ERROR
(
    ID NUMBER(38,0) Primary Key,
    ERROR varchar(4) collate 'en-rtrim' NOT NULL,
)

所以我们在 ERROR 中看到了 rtrimmed 值,然后我们尝试将这些结果转移到另一个雪花表中,而该表上没有设置整理选项

create or replace table DATA.T_ERROR_1
(
    ID NUMBER(38,0) Primary Key,
    ERROR varchar(4) NOT NULL,
)

问题:该DATA.T_ERROR_1表没有从临时表中获取修剪后的值,而是获取原始平面文件中的未修剪值

有没有其他方法可以让我进行这种转移,而不涉及我编写 rtrim ltrim 或 trim 或每一列

4

1 回答 1

2

您的所有表都没有修剪数据。它只在某些情况下才会出现。

该表temp.T_ERROR具有修剪比较语义,这意味着它比较和排序就像它被修剪一样。但赋值不是比较,原始值temp.T_ERROR(填充空格)被复制到新表中DATA.T_ERROR_1。您可以使用例如检查空格是否存在

SELECT '"'||ERROR||'"', LENGTH(ERROR) FROM temp.T_ERROR

正如迈克沃尔顿在其他地方所说,如果您有机会在数据进入雪花之前修剪空间,您的问题可能会得到解决。但是,如果您要移植一个严重依赖CHAR行为的应用程序,则最好为所有列定义。COLLATECHAR

我已经在其他数据库(即 Oracle)上进行了测试,它的行为方式与 Snowflake 相同:如果你复制CHARVARCHAR你也会得到填充空间。

于 2019-11-18T21:47:03.437 回答