一些实验给了我们这些部分答案,ENDSWITH 看起来很有希望,但我最终使用了更长的过程:
SELECT
column1,
ENDSWITH(trim(column1), 'ABC') as end_with_abc,
SPLIT(column1, '-') as s,
array_size(s) AS len_s,
trim(get(s, len_s -1)) as last,
charindex('-', REVERSE(column1), 3) as last_token,
length(column1) - last_token as pos,
substr(column1,1,pos) as prefix,
iff(len_s > 1 AND last = 'ABC', prefix, column1) as answer
FROM values
('EARTH PLANET-ABC'),
('MARS PLANET - ABC'),
('JUPITER -ABC'),
('VENUS- ABC'),
('VENUS_BUT_NOT_DEF'),
('VENUS - DEF');
给予:
| COLUMN1 |
END_WITH_ABC |
S |
LEN_S |
LAST |
LAST_TOKEN |
POS |
PREFIX |
ANSWER |
| EARTH PLANET-ABC |
TRUE |
[ "EARTH PLANET", "ABC" ] |
2 |
ABC |
4 |
12 |
EARTH PLANET |
EARTH PLANET |
| MARS PLANET - ABC |
TRUE |
[ "MARS PLANET ", " ABC" ] |
2 |
ABC |
5 |
12 |
MARS PLANET |
MARS PLANET |
| JUPITER -ABC |
TRUE |
[ "JUPITER ", "ABC" ] |
2 |
ABC |
4 |
8 |
JUPITER |
JUPITER |
| VENUS- ABC |
TRUE |
[ "VENUS", " ABC" ] |
2 |
ABC |
5 |
5 |
VENUS |
VENUS |
| VENUS_BUT_NOT_DEF |
FALSE |
[ "VENUS_BUT_NOT_DEF" ] |
1 |
VENUS_BUT_NOT_DEF |
0 |
17 |
VENUS_BUT_NOT_DEF |
VENUS_BUT_NOT_DEF |
| VENUS - DEF |
FALSE |
[ "VENUS ", " DEF" ] |
2 |
DEF |
5 |
6 |
VENUS |
VENUS - DEF |
可以压缩成:
SELECT
column1,
SPLIT(column1, '-') as s,
iff(array_size(s) > 1 AND trim(get(s, array_size(s) -1)) = 'ABC', substr(column1, 1, length(column1) - charindex('-', REVERSE(column1), 3)), column1) as answer
FROM values
('EARTH PLANET-ABC'),
('MARS PLANET - ABC'),
('JUPITER -ABC'),
('VENUS- ABC'),
('VENUS_BUT_NOT_DEF'),
('VENUS - DEF');
或者如果你喜欢超压缩:
SELECT
column1,
iff(array_size(SPLIT(column1, '-')) > 1 AND trim(get(SPLIT(column1, '-'), array_size(SPLIT(column1, '-')) -1)) = 'ABC', substr(column1, 1, length(column1) - charindex('-', REVERSE(column1), 3)), column1) as answer
FROM values
('EARTH PLANET-ABC'),
('MARS PLANET - ABC'),
('JUPITER -ABC'),
('VENUS- ABC'),
('VENUS_BUT_NOT_DEF'),
('VENUS - DEF');
| COLUMN1 |
ANSWER |
| EARTH PLANET-ABC |
EARTH PLANET |
| MARS PLANET - ABC |
MARS PLANET |
| JUPITER -ABC |
JUPITER |
| VENUS- ABC |
VENUS |
| VENUS_BUT_NOT_DEF |
VENUS_BUT_NOT_DEF |
| VENUS - DEF |
VENUS - DEF |
或
您可以使用 REGEXP_SUBSTR 解决:
SELECT
column1 as orig,
COALESCE(regexp_substr(column1, '^(.*)-\\s*ABC\\s*$', 1,1,'e'), column1) as answer
FROM values
('EARTH PLANET-ABC'),
('MARS PLANET - ABC'),
('JUPITER -ABC'),
('VENUS- ABC'),
('VENUS_BUT_NOT_DEF'),
('VENUS - DEF');
给予:
| ORIG |
ANSWER |
| EARTH PLANET-ABC |
EARTH PLANET |
| MARS PLANET - ABC |
MARS PLANET |
| JUPITER -ABC |
JUPITER |
| VENUS- ABC |
VENUS |
| VENUS_BUT_NOT_DEF |
VENUS_BUT_NOT_DEF |
| VENUS - DEF |
VENUS - DEF |