首页 > 解决方案 > 如何简化 postgres 中的嵌套函数调用和 case 语句?

问题描述

我目前将此片段作为更大查询的一部分。它可以工作,但我想简单地嵌套字符串函数和substringCASE 语句中的重复调用。

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;

这是一个测试用例:

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

我尝试了几种替代方法,但我得到的只是语法错误。

标签: postgresql

解决方案


尝试 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;

推荐阅读