为啥 Redshift 在加入时会自动修剪 varchar 列?

Posted

技术标签:

【中文标题】为啥 Redshift 在加入时会自动修剪 varchar 列?【英文标题】:Why Redshift automatically trims varchar column when joining?为什么 Redshift 在加入时会自动修剪 varchar 列? 【发布时间】:2018-12-01 10:30:40 【问题描述】:

我在使用 Redshift 时遇到了独特的问题。请参阅以下说明性示例:

drop table if exists joinTrim_temp1;
create table joinTrim_temp1(rowIndex1 int, charToJoin1 varchar(20));
insert into joinTrim_temp1 values(1, 'Sudan' );
insert into joinTrim_temp1 values(2, 'Africa' );
insert into joinTrim_temp1 values(3, 'USA' );

drop table if exists joinTrim_temp2;
create table joinTrim_temp2(rowIndex2 int, charToJoin2 varchar(20));
insert into joinTrim_temp2 values(1, 'Sudan ' );
insert into joinTrim_temp2 values(2, 'Africa ' );
insert into joinTrim_temp2 values(3, 'USA ' );

select * from joinTrim_temp1 a join joinTrim_temp2 b on a.charToJoin1 = b.charToJoin2;

查询的输出如下:

在查询中,您可以看到第二个表中有一个尾随空格。所以不应该发生内部连接。但似乎 Redshift 在加入时能够修剪尾随空格。

我在将现有的 Redshift sql 代码转换为 PySpark 时遇到了这个问题。

问候, 库马尔

【问题讨论】:

感谢您强调此“功能”。 【参考方案1】:

啊!确实,一个非常有趣的发现!

来自Character Types - Amazon Redshift:

比较值时,VARCHAR 和 CHAR 值中的尾随空格在语义上无关紧要。

看来,如果您想强制比较,是否需要避免尾随空格,例如:

SELECT * 
FROM joinTrim_temp1 a 
JOIN joinTrim_temp2 b 
ON a.charToJoin1 || '.' = b.charToJoin2 || '.';

【讨论】:

以上是关于为啥 Redshift 在加入时会自动修剪 varchar 列?的主要内容,如果未能解决你的问题,请参考以下文章

为啥直接将 Arrays.asList() 分配给 var 时会出现 AssertionError?

为啥有些游戏在 iPhone 重新安装时会自动继续进行?

为啥 Xcode 自动补全在导入时会提示 .m 文件?

为啥我的自动化测试在一起运行时会失败,但单独通过?

为啥 react-router 在调度时会自动返回上一个路由

为啥我的 superview-with-subview 在模态显示(使用自动布局)时会缩小?