Yuck. This works and I’m recording it here in case I need it again but yuck.
Here’s the scenario: there is a column in a database with a delimited string. The number of delimited values can vary. SOmetimes there will be one delimited value, sometimes there will be twenty. For this specific case I needed to get the last two values. If we weren’t on GreenPlum I would probably go with using the REVERSE function combines with POSITION and SUBSTRING. But alas, REVERSE is not available in GreenPlum (Postgres 8.2). So after much head scratching I came up with the following which will get the last two values and then concatenate them together with a pipe delimiter (don’t ask, that’s what we needed to display in my use case).
create table phil_test (columnA character varying) ; insert into phil_test(columnA) values ('a'); insert into phil_test(columnA) values ('a,b,c,d'); insert into phil_test(columnA) values ('a,b,c,d,e'); insert into phil_test(columnA) values ('a,b,c,d,e,f'); ; select columnA from phil_test order by columnA ; select columnA , coalesce((string_to_array(columnA, ','))[(array_upper((string_to_array(columnA, ',')),1)-1)]||' | ','') ||(string_to_array(columnA, ','))[array_upper((string_to_array(columnA, ',')),1)] as last_two from phil_test order by columnA
While working this out I found the following posts pretty dang helpful:
Stack Overflow: Split comma separated column data into additional columns
PostgreSQL 8.2: Array Functions and Operators
PostgreSQL 8.2: String Functions and Operators (mostly let me know of the very few string functions available to me)
If you’ve got a better way to solve this problem let me know! Also give me a heads up if you’ve had a similar requirement.