amazon-web-services - 为什么 Redshift 在加入时会自动修剪 varchar 列?
问题描述
我在使用 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 时遇到了这个问题。
问候,库马尔
解决方案
啊! 确实,一个非常有趣的发现!
比较值时,VARCHAR 和 CHAR 值中的尾随空格在语义上被视为无关紧要。
看来,如果您希望强制比较,是否需要避免尾随空格,例如:
SELECT *
FROM joinTrim_temp1 a
JOIN joinTrim_temp2 b
ON a.charToJoin1 || '.' = b.charToJoin2 || '.';
推荐阅读
- c# - BroadCastReceiver 未从外部应用程序调用 onReceive
- r - 在 R 中填充和清空水箱
- neo4j - 具有连续匹配的 Cypher 查询返回不需要的关系
- c++ - if constexpr and dependent false static_assert is ill formed?
- java - 调用 getParent() 方法时如何修复“尝试在空对象引用上调用虚拟方法”
- rust - 如何将 nom take_while 和 is_digit 用于 &str 输入
- java - 如何使用 Maven 在 NetBeans 11 中添加本地 .jar 依赖项?
- typescript - TypeScript:数组中项目的特定属性的联合
- flutter - 使用构造函数“className() 和 className._() 的区别
- php - 如何在 url 中放置一个变化的值?