redshift rtrim and collation

0

In redshift, how do I use rtrim to get the original string with its original casing, but match the string to remove case insenstive?

These aren't acceptable solutions:

rtrim('aBcd', 'Cd') = aBc
rtrim('aBcd', 'cd') = aB
rtrim(lower('aBcd'), 'cd) = ab

And this doesn't work

rtrim(collate('aBcd', 'case_insensitive), collate('Cd', 'case_insensitive')) != aB

Do I have to use substring instead?

已提问 1 年前241 查看次数
2 回答
1

The solution is to use a combination of upper, position, substring, and case.

create temporary table mytable (mystring varchar(100));
insert into mytable values ('aBcd'), ('aBCd'), ('aBCD'), ('aBcD');
select substring(mystring, 1, position('CD' in upper(mystring)) - 1) 
from mytable;
 substring 
-----------
 aB
 aB
 aB
 aB

If your data has some rows without some form of CD at the end of it, you need to add some additional logic.

insert into mytable values ('xy'), ('Xy'), ('xY'), ('XY');
select substring(mystring, 1, case when position('CD' in upper(mystring)) = 0 then length(mystring) else position('CD' in upper(mystring)) - 1 end) 
from mytable;
profile pictureAWS
专家
已回答 1 年前
0

Hi,

I would use the regexp_substr function, it provides several options with less code https://docs.aws.amazon.com/redshift/latest/dg/REGEXP_SUBSTR.html.

Example: select regexp_substr('aBcd','aB');

Regards

AWS
专家
Ziad
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则