Reputation: 14454
I currently have this fragment as part of a larger query. It works but I'd like to simply the nested string functions and the duplicated substring
calls within the CASE statement.
SELECT
split_part(
convert_from(
decode(
CASE WHEN char_length(substring(pr.modifications, 'eid=([^&]+)')) IN (74,50) THEN
substring(pr.modifications, 'eid=([^&]+)') || '=='
ELSE
substring(pr.modifications, 'eid=([^&]+)')
END, 'base64'),
'UTF8'),
' ', 1) AS calendar_event_id;
Here is a test case:
SELECT
split_part(
convert_from(
decode(
CASE WHEN char_length('ZmJ0OXQyMTQwa2V0Z3Y5bjZra2I4amVzZjggOHU0ZDc2Zmk5Z2wyc3RxMnQ4a2hrcGd0MWNAZw') IN (74,50) THEN
'ZmJ0OXQyMTQwa2V0Z3Y5bjZra2I4amVzZjggOHU0ZDc2Zmk5Z2wyc3RxMnQ4a2hrcGd0MWNAZw' || '=='
ELSE
'ZmJ0OXQyMTQwa2V0Z3Y5bjZra2I4amVzZjggOHU0ZDc2Zmk5Z2wyc3RxMnQ4a2hrcGd0MWNAZw'
END, 'base64'),
'UTF8'),
' ', 1) AS calendar_event_id;
-- Output:
-- fbt9t2140ketgv9n6kkb8jesf8
I've tried several alternatives, but all I get are syntax errors.
Upvotes: 0
Views: 102
Reputation: 248245
Try a CTE:
WITH mystr AS (
SELECT substring(pr.modifications, 'eid=([^&]+)') AS s
)
SELECT
split_part(
convert_from(
decode(
CASE WHEN char_length(s) IN (74,50) THEN
s || '=='
ELSE
s
END, 'base64'),
'UTF8'),
' ', 1) AS calendar_event_id
FROM mystr;
Upvotes: 1