Почему Redshift автоматически обрезает столбец varchar при присоединении? - PullRequest
0 голосов
/ 01 декабря 2018

Я столкнулся с уникальной проблемой при использовании 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;

Результат запроса следующий:

query Output

В запросе, который выМожно видеть, что во второй таблице есть завершающий пробел.Так что никакого внутреннего соединения не должно быть.Но похоже, что Redshift способен обрезать замыкающие пробелы при присоединении.

Я столкнулся с этой проблемой при преобразовании существующего кода Redshift sql в PySpark.

С уважением, Кумар

1 Ответ

0 голосов
/ 02 декабря 2018

Ах!Действительно, очень интересная находка!

Из Типы символов - Amazon Redshift :

Конечные пробелы в значениях VARCHAR и CHAR обрабатываются как семантически незначимые, когда значениясравниваемые.

Похоже, что если вы хотите форсировать сравнение, вам следует избегать конечного пробела, такого как:

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