sql - 雪花中的排序规则
问题描述
我们创建了一个如图所示的雪花表,并使用复制到命令将数据从平面文件加载到
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 或每一列
解决方案
您的所有表都没有修剪数据。它只在某些情况下才会出现。
该表temp.T_ERROR
具有修剪比较语义,这意味着它比较和排序就像它被修剪一样。但赋值不是比较,原始值temp.T_ERROR
(填充空格)被复制到新表中DATA.T_ERROR_1
。您可以使用例如检查空格是否存在
SELECT '"'||ERROR||'"', LENGTH(ERROR) FROM temp.T_ERROR
正如迈克沃尔顿在其他地方所说,如果您有机会在数据进入雪花之前修剪空间,您的问题可能会得到解决。但是,如果您要移植一个严重依赖CHAR
行为的应用程序,则最好为所有列定义。COLLATE
CHAR
我已经在其他数据库(即 Oracle)上进行了测试,它的行为方式与 Snowflake 相同:如果你复制CHAR
到VARCHAR
你也会得到填充空间。
推荐阅读
- android - Android Fotoapparat 库
- java - 等待多个阻塞队列
- react-native - 在嵌套的 stackNavigator 中传递道具
- c# - 如何在 Entity Framework 和 EF Core 中使用 .Include()
- jsp - cq:include 包含的组件不可编辑
- javascript - 如果代码需要很长时间才能完成,如何在 node.js 中引发超时错误?
- java - javax.net.ssl.SSLHandshakeException:收到致命警报:access_denied
- pointers - Kotlin 有指针吗?
- python - 为什么相同的循环算法性能不同
- c++ - QT将插槽作为参数作为回调传递